DATABIND: Refactoring SetSource dialog source. 81/18681/2
authorparary <kyunghan80.park@samsung.com>
Fri, 28 Mar 2014 04:55:55 +0000 (13:55 +0900)
committerKyungHan Park <kyunghan80.park@samsung.com>
Fri, 28 Mar 2014 04:59:02 +0000 (21:59 -0700)
SetSourceDialog class rename to SetSourcePage in the
org.tizen.webuibuilder.ui.views.databinding.dialog package.
Split SetSourceDialog source code based on the setting panel to
StaticSubPage, RemoteCallSubPage, RuntimeAPISubPage.

Change-Id: If05e7f2cbf6ba43db89fedfeab54aafd35bc746a
Signed-off-by: parary <kyunghan80.park@samsung.com>
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/actions/EditDataSourceAction.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/FileSystemSubPage.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/Helper.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/RemoteCallSubPage.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/RuntimeAPISubPage.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/SetSourcePage.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/SourceDialogSubPage.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/StaticSubPage.java [new file with mode: 0644]
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/model/TreeItemData.java

index ef73a93..c5105e7 100644 (file)
@@ -34,6 +34,7 @@ import org.tizen.webuibuilder.ui.views.databinding.DataBindingPage;
 import org.tizen.webuibuilder.ui.views.databinding.DataBindingView;
 import org.tizen.webuibuilder.ui.views.databinding.SetSourceDialog;
 import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+import org.tizen.webuibuilder.ui.views.databinding.dialog.SetSourcePage;
 
 
 public class EditDataSourceAction extends SelectionAction {
@@ -118,6 +119,9 @@ public class EditDataSourceAction extends SelectionAction {
                 new SetSourceDialog(Display.getCurrent().getActiveShell(), view, treeItem);
         BindingData dataSource = dlg.open();
 
+//        SetSourcePage dlg = new SetSourcePage(Display.getCurrent().getActiveShell(), view, treeItem);
+//        String message = dlg.open();
+
         if (dataSource != null) {
             IPage page = view.getCurrentPage();
             if (!(page instanceof DataBindingPage)) {
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/FileSystemSubPage.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/FileSystemSubPage.java
new file mode 100644 (file)
index 0000000..8d1221b
--- /dev/null
@@ -0,0 +1,134 @@
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+public class FileSystemSubPage implements SourceDialogSubPage {
+    private Group parentGroup;
+    private Tree parentDataTree;
+    private Composite settingComposite;
+    
+    private String jsonFile;
+    private static Gson normalGson;
+    
+    static{
+        normalGson = new GsonBuilder().serializeNulls().create();
+    }
+    
+    public FileSystemSubPage( Group dataGroup, Tree dialogTree ){
+        parentGroup = dataGroup;
+        parentDataTree = dialogTree;
+    }
+    
+    @Override
+    public BindingData getData() {
+        BindingData dataModel = new BindingData();
+        
+        JsonObject root = new JsonObject();
+        TreeItem[] items = parentDataTree.getItems();
+        for (TreeItem item : items) {
+            Helper.makeJsonFromTree( item, root);
+        }
+        
+        dataModel.setJsonData( normalGson.toJson(root) );
+        dataModel.setStaticFilePath(jsonFile);
+        
+        return dataModel;
+    }
+
+    @Override
+    public Composite getSettingComposite() {
+        if( settingComposite == null ){
+            createSettingComposite();
+        }
+        return settingComposite;
+    }
+
+    private void createSettingComposite() {
+        settingComposite = new Composite(parentGroup, SWT.NONE);
+        FormLayout layout = new FormLayout();
+        
+        settingComposite.setLayout(layout);
+        
+        Label label = new Label(settingComposite, SWT.NONE);
+        label.setText( "Path" );
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        label.setLayoutData(data);
+
+        Text text = new Text(settingComposite, SWT.SINGLE | SWT.BORDER);
+        text.setEnabled(false);
+        
+        data = new FormData();
+        data.top = new FormAttachment(label, 0);
+        data.left = new FormAttachment(10, 0);
+        data.right = new FormAttachment(90, 0);
+        text.setLayoutData(data);
+        
+        Button button = new Button(settingComposite, SWT.PUSH );
+        data = new FormData(20,20);
+        data.top = new FormAttachment(label, 0);
+        data.left = new FormAttachment(text, 5);
+        data.right = new FormAttachment(100, -5);
+        button.setLayoutData(data);
+        
+        button.setText( "I" );
+        button.setToolTipText( "Import File" );
+        
+        button.addSelectionListener(new SelectionAdapter(){
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                Helper.getProjectfile();
+            }
+        });
+    }
+
+    @Override
+    public void setButtonsState(Map<String, Button> dataButtonMap) {
+        dataButtonMap.get("addTreeItem").setVisible(false);
+        dataButtonMap.get("upTreeItem").setVisible(false);
+        dataButtonMap.get("downTreeItem").setVisible(false);
+        dataButtonMap.get("removeTreeItem").setVisible(false);
+        dataButtonMap.get("removeAllTreeItem").setVisible(false);
+
+        Button conversionTreeAndText = dataButtonMap.get("conversionTreeAndText");
+        
+        if( conversionTreeAndText.getSelection() ){
+            conversionTreeAndText.setSelection(false);
+            Event e = new Event(); 
+            e.item = conversionTreeAndText; 
+            e.widget = conversionTreeAndText; 
+            e.type = SWT.Selection; 
+            conversionTreeAndText.notifyListeners(SWT.Selection, e);
+        }
+        conversionTreeAndText.setVisible(false);
+    }
+
+    @Override
+    public void loadData(BindingData dataModel) {
+        jsonFile = dataModel.getStaticFilePath();
+        JsonObject json = Helper.readJsonFromFile( jsonFile );
+        if( json != null )
+            Helper.makeTreeItem(json, parentDataTree, null, true);
+    }
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/Helper.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/Helper.java
new file mode 100644 (file)
index 0000000..c011bf1
--- /dev/null
@@ -0,0 +1,458 @@
+/*
+ * UI Builder
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.tizen.webuibuilder.BuilderConstants;
+import org.tizen.webuibuilder.ui.views.databinding.model.TreeItemData;
+import org.tizen.webuibuilder.utility.ResourceManager;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+
+public class Helper {
+    private static Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
+    
+    public static JsonObject readJsonFromURL(String url, String method ,TableItem[] items ) throws IOException {
+        BufferedReader br = null;
+        OutputStreamWriter writer = null ;
+        JsonObject result = null;
+        try{
+            
+            HttpURLConnection con = null;
+            if( method.equals( "GET" ) ){
+                String delimiter = "?";
+                if( url.contains( "?" ) ){
+                    delimiter = "&";
+                }
+                con = (HttpURLConnection) new URL( url + delimiter + genParameter(items).toString() ).openConnection();
+            }else{
+                con = (HttpURLConnection) new URL( url ).openConnection();
+                con.setDoOutput(true);
+                writer = new OutputStreamWriter(con.getOutputStream());
+                writer.write( genParameter(items).toString() );
+                writer.flush();
+            }
+            
+            con.setRequestMethod(method);
+            con.setDoInput(true);
+            
+            if( con.getResponseCode() != 200 ){
+                return null;
+            }
+            
+            br = new BufferedReader( new InputStreamReader(  con.getInputStream() ) );
+            result =  gson.fromJson( br, JsonObject.class );
+            
+            if( writer != null ){
+                writer.close();
+                writer = null;
+            }
+            br.close();
+            br = null;
+            
+            return result;
+        }catch( IOException e ){
+            e.printStackTrace();
+            return null;
+        }finally{
+            try { if( br != null)  br.close(); } catch ( IOException e ) { e.printStackTrace(); };
+            try { if( writer != null)  writer.close(); } catch ( IOException e ) { e.printStackTrace(); };
+        }
+    }
+    
+    private static StringBuilder genParameter(TableItem[] items) {
+        
+        StringBuilder sb = new StringBuilder();
+        boolean isFirst = true;
+        for( TableItem item : items ){
+            if( !isFirst ){
+                sb.append("&");
+            }
+            sb.append( item.getText(0) ).append( "=" ).append( item.getText(1) );
+            isFirst = false;
+        }
+        return sb;
+    }
+
+    public static JsonObject readJsonFromFile(String file) {
+        BufferedReader br = null;
+        JsonObject result = null;
+        try{
+            br = new BufferedReader( new InputStreamReader( new FileInputStream( new File(file) ) ) );
+            result =  gson.fromJson( br, JsonObject.class );
+            br.close();
+            br = null;
+        }catch( IOException e ){
+            e.printStackTrace();
+            return null;
+        }finally{
+            try { if( br != null)  br.close(); } catch ( IOException e ) { e.printStackTrace(); };
+        }
+        
+        return result;
+    }
+    
+    public static void makeTreeItem( JsonElement jsonElement, Tree tree, TreeItem item, boolean includeIndex ) {
+        if (jsonElement.isJsonArray()) {
+            JsonArray array = jsonElement.getAsJsonArray();
+            
+            for (int i = 0; i < array.size(); i++) {
+                if( includeIndex ){
+                    TreeItem indexItem = new TreeItem( item, 0);
+                    careteTreeItem( indexItem, String.valueOf(i), null, "Index" );
+                    makeTreeItem(array.get( i ), tree, indexItem, includeIndex);   
+                    indexItem.setExpanded(true);
+                }else{
+                    makeTreeItem(array.get( i ), tree, item, includeIndex);
+                    break;
+                }
+            }
+        } else if (jsonElement.isJsonObject()) {
+            
+            JsonObject jb = jsonElement.getAsJsonObject();
+            Set<Entry<String, JsonElement>> entrys =  jb.entrySet();
+            for (Entry<String, JsonElement> entry : entrys) {
+                
+                TreeItem treeItem = null;
+                if( item == null){
+                    treeItem = new TreeItem( tree, 0);   
+                }else{
+                    treeItem = new TreeItem( item, 0);   
+                }
+                 
+                if( entry.getValue().isJsonPrimitive() ){
+                    JsonPrimitive jp = entry.getValue().getAsJsonPrimitive();
+                    String type = null;
+                    if( jp.isBoolean() )
+                        type = "Boolean";
+                    else if( jp.isNumber() )
+                        type = "Number";
+                    else if( jp.isString() )
+                        type = "String";
+                    
+                    careteTreeItem( treeItem, entry.getKey(), jp.getAsString(), type );
+                }else if( entry.getValue().isJsonObject() ){
+                    careteTreeItem( treeItem, entry.getKey(), null, "Object" );
+                    makeTreeItem( entry.getValue(), tree, treeItem, includeIndex );
+                }else if( entry.getValue().isJsonArray() ){
+                    careteTreeItem( treeItem, entry.getKey(), null, "Array" );
+                    makeTreeItem( entry.getValue(), tree, treeItem, includeIndex );
+                }else if( entry.getValue().isJsonNull() ){
+                    careteTreeItem( treeItem, entry.getKey(), null, "undefined" );
+                    makeTreeItem( entry.getValue(), tree, treeItem, includeIndex );
+                }
+                treeItem.setExpanded(true);
+            }
+            return;
+        }else if (jsonElement.isJsonPrimitive()) {
+            JsonPrimitive jp = jsonElement.getAsJsonPrimitive();
+            String type = null;
+            if( jp.isBoolean() ){
+                type = "Boolean";
+            }else if( jp.isNumber() ){
+                type = "Number";
+            }else if( jp.isString() ){
+                type = "String";
+            }
+            
+            if( item.getParent().getColumnCount() > 0 ){
+                Helper.careteTreeItem( new TreeItem( item, 0), null, jp.getAsString(), type );
+            }
+        }
+    }
+    
+    private static TreeItem careteTreeItem(TreeItem treeItem, String key, String value, String type) {
+
+        TreeItemData treeItemData = new TreeItemData();
+        
+        if( treeItem.getParent().getColumnCount() == 1){
+            treeItem.setText( key );
+        }else{
+            treeItem.setText(new String[] { key, value, type });
+        }
+        
+        treeItemData.setObjectType(type);
+        treeItemData.setObjectValue(value);
+        treeItemData.setSource( "original" );
+        
+        treeItem.setData("TREEITEMDATA", treeItemData);
+
+        String imageName = null;
+        switch (type) {
+            case "Boolean":
+                break;
+            case "Number":
+                break;
+            case "String":
+                break;
+            case "Array":
+                imageName = "temp.png";
+                break;
+            case "Index":
+                break;
+            default:
+                break;
+        }
+
+        if (imageName != null) {
+            treeItem.setImage ( ResourceManager.getImage( BuilderConstants.ICON_DIR, imageName ) );
+        }
+
+        return treeItem;
+    }
+    
+    public static void makeJsonFromTree(TreeItem parentItem, JsonElement parentJsonElement) {
+        String key = parentItem.getText(0);
+        String value = parentItem.getText(1);
+        String type = parentItem.getText(2);
+        
+        TreeItem[] items = parentItem.getItems();
+        
+        JsonObject parentJson = null;
+        JsonArray parentArray = null;
+        
+        if( parentJsonElement instanceof JsonObject ){
+            parentJson = (JsonObject) parentJsonElement;
+        } else if( parentJsonElement instanceof JsonArray ){
+            parentArray = (JsonArray) parentJsonElement;
+        }
+        
+        JsonObject jsonOb = null;
+        
+        switch(type){
+            case "Array":
+                JsonArray array = new JsonArray();
+                parentJson.add(key, array);
+                jsonOb = null;
+                for (TreeItem item : items) {
+                    if( item.getText(2).equals("Index") ){
+                        makeJsonFromTree( item, array );
+                    }else{
+                        if( jsonOb == null){
+                            jsonOb = new JsonObject();
+                            array.add(jsonOb);
+                        }
+                        makeJsonFromTree( item, jsonOb );
+                    }
+                }
+                break;
+            case "Object":
+                jsonOb = new JsonObject();
+                parentJson.add(key, jsonOb);
+                for (TreeItem item : items) {
+                    makeJsonFromTree( item, jsonOb );
+                }
+                break;
+            case "Index":
+                jsonOb = new JsonObject();; 
+                for (TreeItem item : items) {
+                    if(item.getText().length() > 0){
+                        makeJsonFromTree( item, jsonOb );
+                    }else{
+                        parentArray.add( new JsonPrimitive(item.getText(1)) );
+                    }
+                }
+                if( !jsonOb.entrySet().isEmpty() )
+                    parentArray.add(jsonOb);
+                break;
+            case "String":
+                    parentJson.addProperty( key, value );
+                break;
+            case "Boolean":
+                parentJson.addProperty( key, Boolean.valueOf( value ) );
+                break;
+            case "Number":
+                parentJson.addProperty( key, Long.parseLong( value ) );
+                break;
+            case "undefined":
+                parentJson.add( key, null );
+                break;
+            default:
+                break;
+        }
+    }
+    
+    public static Composite makeInputText(Composite parentComposite, String title) {
+
+        Composite subComposite = new Composite(parentComposite, SWT.NONE);
+        FormLayout layout = new FormLayout();
+        subComposite.setLayout(layout);
+
+        Label label = new Label(subComposite, SWT.NONE);
+        label.setText(title);
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        label.setLayoutData(data);
+
+        final Text text = new Text(subComposite, SWT.SINGLE | SWT.BORDER);
+        data = new FormData();
+        data.top = new FormAttachment(label, 0);
+        data.left = new FormAttachment(10, 0);
+        data.right = new FormAttachment(100, 0);
+        text.setLayoutData(data);
+        subComposite.setData(text);
+        return subComposite;
+    }
+    
+    public static Composite makeInputCombo(Composite parentComposite, String title, String[] items) {
+
+        Composite subComposite = new Composite(parentComposite, SWT.NONE);
+        FormLayout layout = new FormLayout();
+        subComposite.setLayout(layout);
+
+        Label label = new Label(subComposite, SWT.NONE);
+        label.setText(title);
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        label.setLayoutData(data);
+
+        CCombo combo = new CCombo(subComposite, SWT.SINGLE | SWT.BORDER | SWT.FLAT | SWT.READ_ONLY);
+        data = new FormData();
+        data.top = new FormAttachment(label, 0);
+        data.left = new FormAttachment(10, 0);
+        data.right = new FormAttachment(100, 0);
+        combo.setLayoutData(data);
+        combo.setItems(items);
+        combo.select(0);
+
+        subComposite.setData(combo);
+
+        return subComposite;
+    }
+    
+    public static String getParamString( TableItem[] items ) {
+        StringBuilder query = new StringBuilder();
+        boolean isFirst = true;
+        
+        for (TableItem item : items ) {
+            
+            if( isFirst ){
+                isFirst = false;
+            }else{
+                query.append( "&" );
+            }
+            
+            query.append( item.getText(0) ).append( "=" ).append( item.getText(1) ); 
+        }
+        return query.toString();
+    }
+    
+    
+    public static Object getProjectfile(){
+        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog ( Display.getCurrent().getActiveShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider() );
+        dialog.setTitle( "Select File" );
+        
+        IProject project = null;
+        
+        IFile file = (IFile) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorInput().getAdapter(IFile.class);
+        project = file.getProject();
+        
+        if( project != null ){
+            dialog.setInput(project);
+            dialog.open();
+        }
+        
+        return dialog.getFirstResult();
+        
+//        dialog.addFilter(new ViewerFilter() {
+//            @Override
+//            public boolean select(Viewer viewer, Object parentElement,
+//                    Object element) {
+//                boolean ret = false;
+//                String[] extensions = null;
+//                extensions = new String[] { "*" };
+//                try {
+//                    ret = isUMLResource((IResource) element, extensions);
+//                } catch (CoreException e) {
+//                    // TODO Auto-generated catch block
+//                    e.printStackTrace();
+//                }
+//                return ret;
+//            }
+//        });
+        
+    }
+    
+//    private static boolean isUMLResource(IResource resource, String[] extensions)
+//            throws CoreException {
+//        if (resource instanceof IContainer) {
+//            if (((IContainer) resource).isAccessible()) {
+//                IResource[] members = ((IContainer) resource).members();
+//                for (IResource member : members) {
+//                    if (isUMLResource(member, extensions)) {
+//                        return true;
+//                    }
+//                }
+//            }
+//        } else if (resource instanceof IFile) {
+//            IFile currentFile = (IFile) resource;
+//            if (extensions == null) {
+//                return true;
+//            } else if (currentFile.getFileExtension() != null) {
+//                for (int i = 0; i < extensions.length; i++) {
+//                    String extension = extensions[i];
+//                    if (currentFile.getFileExtension().toUpperCase().equals(
+//                            extension.toUpperCase())) {
+//                        return true;
+//                    }
+//                }
+//            }
+//        }
+//        return false;
+//    } 
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/RemoteCallSubPage.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/RemoteCallSubPage.java
new file mode 100644 (file)
index 0000000..b9de437
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * UI Builder
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+public class RemoteCallSubPage implements SourceDialogSubPage {
+
+    private Group parentGroup;
+    private Tree parentDataTree;
+    private Composite settingComposite;
+    
+    private Text urlText;
+    private CCombo methodSettingCombo;
+    private CCombo proxySettingCombo;
+    private CCombo sourceTypeCombo;
+    private Text timeoutText;
+    private Table requestParam;
+    
+    private StyledText dataSourceStyledText;
+    
+    
+    
+    private static Gson gson;
+    
+    static{
+        gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
+    }
+    
+       public RemoteCallSubPage( Group dataGroup, Tree dialogTree ){
+        parentGroup = dataGroup;
+        parentDataTree = dialogTree;
+    }
+
+       @Override
+       public BindingData getData() {
+           
+               BindingData dataModel = new BindingData();
+               
+               dataModel.setURL(urlText.getText());
+        dataModel.setMethod(methodSettingCombo.getText());
+        dataModel.setProxy(proxySettingCombo.getText());
+        dataModel.setQuery( Helper.getParamString(requestParam.getItems()) );
+        dataModel.setSourceType(sourceTypeCombo.getText());
+        dataModel.setTimeout(timeoutText.getText());
+
+        if (parentDataTree.getItemCount() == 0) {
+            makeDataModel();
+        }
+        
+        JsonObject root = new JsonObject();
+        TreeItem[] items = parentDataTree.getItems();
+        for (TreeItem item : items) {
+            Helper.makeJsonFromTree( item, root);
+        }
+        
+        dataModel.setJsonData( gson.toJson(root) );
+        return dataModel;
+       }
+
+    @Override
+    public Composite getSettingComposite() {
+        if( settingComposite == null ){
+            createSettingComposite();
+        }
+        return settingComposite;
+    }
+
+    private void createSettingComposite() {
+        
+        settingComposite = new Composite(parentGroup, SWT.BORDER);
+        FormLayout layout = new FormLayout();
+
+        settingComposite.setLayout(layout);
+        layout.marginWidth = 5;
+        layout.marginHeight = 5;
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        settingComposite.setLayoutData(data);
+        
+        Button laodButton = new Button(settingComposite, SWT.PUSH);
+        laodButton.setText("L");
+        laodButton.setToolTipText( "Load" );
+        
+        data = new FormData(25, 25);
+        data.bottom = new FormAttachment(100, 0);
+        data.right = new FormAttachment(100, 5);
+        
+        laodButton.setLayoutData(data);
+        
+        laodButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                
+                parentDataTree.getShell().setCursor( new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT) );
+                
+                for( Control control : parentDataTree.getChildren() ){
+                    control.dispose();
+                }
+                parentDataTree.removeAll();
+                makeDataModel();
+                
+                parentDataTree.getShell().setCursor( new Cursor(Display.getCurrent(), SWT.CURSOR_ARROW) );
+            }
+        });
+        
+        Composite urlComposite = Helper.makeInputText(settingComposite, "URL");
+        data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(laodButton, -3);
+        urlComposite.setLayoutData(data);
+
+        urlText = (Text) urlComposite.getData();
+        
+        
+        Listener listener = new Listener() {
+            @Override
+            public void handleEvent(Event event) {
+                if( !( event.type == SWT.FocusOut || event.type == SWT.KeyDown ) )
+                    return;
+                else if( event.type == SWT.KeyDown && event.keyCode != 13 ){
+                    return;
+                }
+                
+                String url = urlText.getText();
+                if( !url.contains( "?" ) ){
+                    return;
+                }
+                
+                urlText.setText( url.substring(0,url.indexOf( "?" ) ) );
+                String[] params = url.substring( url.indexOf( "?" )+1 ).split( "&" );
+                
+                requestParam.removeAll();
+                
+                for( String param : params ){
+                    String[] data = param.split("=");
+                    TableItem item = new TableItem(requestParam, SWT.BORDER);
+                    item.setText(data);
+                }
+            }
+        };
+        
+        urlText.addListener( SWT.FocusOut, listener);
+        urlText.addListener( SWT.KeyDown, listener );
+
+        Composite methodComposite = Helper.makeInputCombo(settingComposite, "METHOD", new String[] { "GET", "POST", "PUT", "DELETE" });
+        
+        data = new FormData();
+        data.top = new FormAttachment(urlComposite, 5);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(laodButton, -3);
+        methodComposite.setLayoutData(data);
+        
+        methodSettingCombo = (CCombo) methodComposite.getData();
+        methodSettingCombo.setEnabled(false);
+
+        Composite proxyComposite = Helper.makeInputCombo(settingComposite, "PROXY", new String[] { "jsonp", "ajax" });
+        
+        data = new FormData();
+        data.top = new FormAttachment(methodComposite, 5);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(laodButton, -3);
+        proxyComposite.setLayoutData(data);
+        
+        proxySettingCombo = (CCombo) proxyComposite.getData();
+        proxySettingCombo.setEnabled(false);
+
+        Composite sourceTypeComposite = Helper.makeInputCombo(settingComposite, "SOURCE TYPE", new String[] { "json", "xml" });
+        
+        data = new FormData();
+        data.top = new FormAttachment(proxyComposite, 5);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(laodButton, -3);
+        sourceTypeComposite.setLayoutData(data);
+        
+        sourceTypeCombo = (CCombo) sourceTypeComposite.getData();
+        sourceTypeCombo.setEnabled(false);
+
+        Composite timeoutComposite = Helper.makeInputText(settingComposite, "TIMEOUT");
+        data = new FormData();
+        data.top = new FormAttachment(sourceTypeComposite, 5);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(laodButton, -3);
+        timeoutComposite.setLayoutData(data);
+        
+        timeoutText = (Text) timeoutComposite.getData();
+        timeoutText.setText("5000");
+        
+        Composite queryComposite = makeQueryTable(settingComposite);
+      
+        data = new FormData();
+        data.top = new FormAttachment(timeoutComposite, 5);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(laodButton, -3);
+        data.bottom = new FormAttachment(laodButton, -3);
+        queryComposite.setLayoutData(data);
+      
+        makeSourceStyledText(parentDataTree.getParent());
+    }
+    
+    private Composite makeQueryTable(Composite parentComposite) {
+        Composite subComposite = new Composite(parentComposite, SWT.NONE);
+        FormLayout layout = new FormLayout();
+        subComposite.setLayout(layout);
+        
+        Label label = new Label(subComposite, SWT.NONE);
+        label.setText( "REQUEST PARAMETER" );
+        
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        label.setLayoutData(data);
+        
+        Button remove = new Button(subComposite, SWT.PUSH);
+        remove.setText("-");
+        remove.setToolTipText("Remove");
+
+        remove.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                for( TableItem item : requestParam.getItems()){
+                    if( item.getChecked() ){
+                        requestParam.remove(requestParam.indexOf(item));
+                    }
+                }
+            }
+        });
+        
+        data = new FormData();
+        data.top = new FormAttachment(3, 0);
+        data.right = new FormAttachment(100, -3);
+        remove.setLayoutData(data);
+
+        Button add = new Button(subComposite, SWT.PUSH);
+        add.setText("+");
+        add.setToolTipText("Add");
+        
+        add.addSelectionListener( new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                new TableItem(requestParam, SWT.BORDER);
+            }
+        } );
+
+        data = new FormData();
+        data.top = new FormAttachment(3, 0);
+        data.right = new FormAttachment(remove, -3);
+        add.setLayoutData(data);
+        
+        Composite composite = new Composite(subComposite, SWT.NONE);
+        
+        data = new FormData(50,100);
+        data.top = new FormAttachment(add, 2);
+        data.right = new FormAttachment(100, 0);
+        data.left = new FormAttachment(10, 0);
+        data.bottom = new FormAttachment(100, 0);
+        composite.setLayoutData(data);
+
+        TableColumnLayout tableLayout = new TableColumnLayout();
+        composite.setLayout(tableLayout);
+
+        requestParam = new Table(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.CHECK );
+
+        requestParam.setHeaderVisible(true);
+
+        TableColumn tblclmnKey = new TableColumn(requestParam, SWT.LEFT);
+        tableLayout.setColumnData(tblclmnKey, new ColumnWeightData(4, ColumnWeightData.MINIMUM_WIDTH, false));
+        tblclmnKey.setText("Key");
+
+        TableColumn tblclmnValue = new TableColumn(requestParam, SWT.LEFT);
+        tableLayout.setColumnData(tblclmnValue, new ColumnWeightData(4, ColumnWeightData.MINIMUM_WIDTH, false));
+        tblclmnValue.setText("Value");
+
+
+        final TableEditor editor = new TableEditor(requestParam);
+        editor.horizontalAlignment = SWT.LEFT;
+        editor.grabHorizontal = true;
+
+        requestParam.addListener(SWT.MouseDown, new Listener() {
+            public void handleEvent(Event event) {
+                Rectangle clientArea = requestParam.getClientArea();
+                Point pt = new Point(event.x, event.y);
+                int index = requestParam.getTopIndex();
+                while (index < requestParam.getItemCount()) {
+                    boolean visible = false;
+                    final TableItem item = requestParam.getItem(index);
+                    for (int i = 0; i < requestParam.getColumnCount(); i++) {
+                        Rectangle rect = item.getBounds(i);
+                        if (rect.contains(pt)) {
+                            final int column = i;
+                            final Text text = new Text(requestParam, SWT.NONE);
+                            Listener textListener = new Listener() {
+                                public void handleEvent(final Event e) {
+                                    switch (e.type) {
+                                        case SWT.FocusOut:
+                                            item.setText(column, text.getText());
+                                            text.dispose();
+                                            break;
+                                        case SWT.Traverse:
+                                            switch (e.detail) {
+                                                case SWT.TRAVERSE_RETURN:
+                                                    item.setText(column, text.getText());
+                                                    // FALL THROUGH
+                                                case SWT.TRAVERSE_ESCAPE:
+                                                    text.dispose();
+                                                    e.doit = false;
+                                            }
+                                            break;
+                                    }
+                                }
+                            };
+                            text.addListener(SWT.FocusOut, textListener);
+                            text.addListener(SWT.Traverse, textListener);
+                            editor.setEditor(text, item, i);
+                            text.setText(item.getText(i));
+                            text.selectAll();
+                            text.setFocus();
+                            return;
+                        }
+                        if (!visible && rect.intersects(clientArea)) {
+                            visible = true;
+                        }
+                    }
+                    if (!visible)
+                        return;
+                    index++;
+                }
+            }
+        });
+        return subComposite;
+    }
+
+    private void makeDataModel() {
+        try {
+            JsonObject json = null;
+            
+            json = Helper.readJsonFromURL( urlText.getText(), methodSettingCombo.getText(), requestParam.getItems()  );    
+            
+            if (json != null) {
+                dataSourceStyledText.setText( gson.toJson(json) );
+                Helper.makeTreeItem( json, parentDataTree, null, false  );
+            } else {
+                dataSourceStyledText.setText("");
+                
+                for( Control control : parentDataTree.getChildren() ){
+                    control.dispose();
+                }
+                parentDataTree.removeAll();
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+    
+    public StyledText getDataSourceStyledText(){
+        return dataSourceStyledText;
+    }
+    
+    
+    private void makeSourceStyledText(Composite composite) {
+        dataSourceStyledText = new StyledText(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        dataSourceStyledText.setLayoutData(data);
+    }
+    
+    @Override
+    public void setButtonsState(Map<String, Button> dataButtonMap) {
+        
+        if (dataButtonMap.get("conversionTreeAndText").getSelection()) {
+            dataButtonMap.get("addTreeItem").setEnabled(false);
+            dataButtonMap.get("upTreeItem").setEnabled(false);
+            dataButtonMap.get("downTreeItem").setEnabled(false);
+            dataButtonMap.get("removeTreeItem").setEnabled(false);
+            dataButtonMap.get("removeAllTreeItem").setEnabled(false);
+        } else {
+            dataButtonMap.get("addTreeItem").setEnabled(true);
+            dataButtonMap.get("upTreeItem").setEnabled(true);
+            dataButtonMap.get("downTreeItem").setEnabled(true);
+            dataButtonMap.get("removeTreeItem").setEnabled(true);
+            dataButtonMap.get("removeAllTreeItem").setEnabled(true);
+        }
+        dataButtonMap.get("conversionTreeAndText").setVisible(true);
+    }
+    
+    @Override
+    public void loadData(BindingData dataModel) {
+        JsonObject json = gson.fromJson(dataModel.getJsonData(), JsonObject.class );
+        urlText.setText( dataModel.getURL() );
+        methodSettingCombo.select( Arrays.asList(methodSettingCombo.getItems()).indexOf( dataModel.getMethod() ) );
+        proxySettingCombo.select( Arrays.asList(proxySettingCombo.getItems()).indexOf( dataModel.getProxy() ) );
+        setParamString( dataModel.getQuery() );
+        sourceTypeCombo.select( Arrays.asList(sourceTypeCombo.getItems()).indexOf( dataModel.getSourceType() ) );
+        timeoutText.setText( dataModel.getTimeout() );
+        
+        Helper.makeTreeItem(json, parentDataTree, null, false);
+    }
+
+    private void setParamString(String query) {
+        String[] params = query.split( "&" );
+        for (int i = 0; i < params.length; i++) {
+            String[] param = params[i].split("=");
+            if(param.length == 0){
+                continue;
+            }else{
+                TableItem item = new TableItem(requestParam, SWT.BORDER);
+                item.setText(param);
+            }
+        }
+    }
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/RuntimeAPISubPage.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/RuntimeAPISubPage.java
new file mode 100644 (file)
index 0000000..502135e
--- /dev/null
@@ -0,0 +1,153 @@
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.tizen.webuibuilder.BuilderConstants;
+import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+import org.tizen.webuibuilder.utility.ResourceUtil;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+public class RuntimeAPISubPage implements SourceDialogSubPage {
+
+    private Group parentGroup;
+    private Tree parentDataTree;
+    private Composite settingComposite;
+    
+    private CCombo runtimeApiSettingCombo;
+    
+    private static Gson gson;
+    
+    static{
+        gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
+    }
+    
+    public RuntimeAPISubPage( Group dataGroup, Tree dialogTree ){
+        parentGroup = dataGroup;
+        parentDataTree = dialogTree;
+    }
+
+       @Override
+       public BindingData getData() {
+               BindingData dataModel = new BindingData();
+               dataModel.setRuntimeApiName( runtimeApiSettingCombo.getText() );
+               
+               JsonObject root = new JsonObject();
+        TreeItem[] items = parentDataTree.getItems();
+        for (TreeItem item : items) {
+            Helper.makeJsonFromTree( item, root);
+        }
+        
+        dataModel.setJsonData( gson.toJson(root) );
+        
+               return dataModel;
+       }
+
+    @Override
+    public Composite getSettingComposite() {
+        if( settingComposite == null ){
+            createSettingComposite();
+        }
+        return settingComposite;
+    }
+
+    private void createSettingComposite() {
+        settingComposite = new Composite(parentGroup, SWT.BORDER);
+        FormLayout layout = new FormLayout();
+
+        settingComposite.setLayout(layout);
+        layout.marginWidth = 5;
+        layout.marginHeight = 5;
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        settingComposite.setLayoutData(data);
+
+        Composite apiComposite = Helper.makeInputCombo(settingComposite, "API", new String[] {
+                        "tizen.contact.addressBooks", "tizen.contact.unifiedAddressBook",
+                        "tizen.contact.defaultAddressBook", "tizen.contact.addressBook" });
+        
+        data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(100, 0);
+        apiComposite.setLayoutData(data);
+
+        runtimeApiSettingCombo = (CCombo) apiComposite.getData();
+        runtimeApiSettingCombo.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+                
+                for( Control control : parentDataTree.getChildren() ){
+                    control.dispose();
+                }
+                
+                parentDataTree.removeAll();
+                
+                String fileName = null;
+                
+                if (runtimeApiSettingCombo.getText().equals("tizen.contact.addressBooks")) {
+                    fileName = "addressBooks.json";
+                } else if (runtimeApiSettingCombo.getText().equals("tizen.contact.unifiedAddressBook")) {
+                    fileName = "unifiedAddressBook.json";
+                } else if (runtimeApiSettingCombo.getText().equals("tizen.contact.defaultAddressBook")) {
+                    fileName = "addressBook.json";
+                } else if (runtimeApiSettingCombo.getText().equals("tizen.contact.addressBook")) {
+                    fileName = "addressBook.json";
+                }
+                
+                String path = ResourceUtil.getAbsolutePath( BuilderConstants.DATABINDING_DIR + fileName );
+                
+                JsonObject json = Helper.readJsonFromFile( path );
+                
+                Helper.makeTreeItem( json, parentDataTree, null, false);
+            }
+        });        
+    }
+
+    @Override
+    public void setButtonsState(Map<String, Button> dataButtonMap) {
+        dataButtonMap.get( "addTreeItem" ).setEnabled(false);
+        dataButtonMap.get( "upTreeItem" ).setEnabled(false);
+        dataButtonMap.get( "downTreeItem" ).setEnabled(false);
+        dataButtonMap.get( "removeTreeItem" ).setEnabled(false);
+        dataButtonMap.get( "removeAllTreeItem" ).setEnabled(false);
+        Button conversionTreeAndText = dataButtonMap.get("conversionTreeAndText");
+        
+        if( conversionTreeAndText.getSelection() ){
+            conversionTreeAndText.setSelection(false);
+            Event e = new Event(); 
+            e.item = conversionTreeAndText; 
+            e.widget = conversionTreeAndText; 
+            e.type = SWT.Selection; 
+            conversionTreeAndText.notifyListeners(SWT.Selection, e);
+        }
+        
+        conversionTreeAndText.setVisible(false);
+    }
+
+    @Override
+    public void loadData(BindingData dataModel) {
+        int idx = Arrays.asList(runtimeApiSettingCombo.getItems()).indexOf(dataModel.getRuntimeApiName());
+        runtimeApiSettingCombo.select( idx );
+        JsonObject json = gson.fromJson(dataModel.getJsonData(), JsonObject.class );
+        Helper.makeTreeItem(json, parentDataTree, null, false);
+    }
+
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/SetSourcePage.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/SetSourcePage.java
new file mode 100644 (file)
index 0000000..250f1f7
--- /dev/null
@@ -0,0 +1,995 @@
+/*
+ * UI Builder
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.custom.TreeEditor;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Dialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.tizen.webuibuilder.ui.views.databinding.DataBindingDnDManager;
+import org.tizen.webuibuilder.ui.views.databinding.DataBindingView;
+import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+import org.tizen.webuibuilder.ui.views.databinding.model.TreeItemData;
+
+import com.google.gson.JsonObject;
+
+public class SetSourcePage extends Dialog {
+
+       private DataBindingView view;
+       private Shell shell;
+       private TreeItem dataSourceTreeItem;
+
+       private StackLayout setttingStackLayout;
+       private StackLayout dataStackLayout;
+
+       private StaticSubPage staticSubPage;
+       private RemoteCallSubPage remoteCallSubPage;
+       private RuntimeAPISubPage runtimeAPISubPage;
+       private FileSystemSubPage fileSystemSubPage;
+       
+       private SourceDialogSubPage currentSubPage;
+       
+       private Button updateOnStartUp;
+       private Combo dataTypeCombo;
+       private Tree dialogTree;
+       private Composite treeComposite;
+       private Composite dataComposite;
+       
+       private Group dataModelGroup;
+       
+       private SashForm sashForm;
+       
+       private Map<String, Button> dataButtonMap = new HashMap<String,Button>();
+       
+       private String message;
+       private List<String> types = Arrays.asList( new String[]{ "Boolean","Number","String" } );
+       
+       /**
+        * Constructor.
+        * 
+        * @param parent
+        * @param view
+        * @param dataSourceTreeItem
+        */
+       public SetSourcePage( Shell parent, DataBindingView view, TreeItem dataSourceTreeItem ){
+               super( parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL );
+               setText( "Set Source" );
+               this.dataSourceTreeItem = dataSourceTreeItem;
+               this.view = view;
+       }
+
+       /**
+        * Opens the dialog and returns the input
+        * 
+        * @return message
+        */
+       public String open() {
+               // Create the dialog window
+               shell = new Shell( getParent(), SWT.TITLE | SWT.CLOSE | SWT.BORDER | SWT.RESIZE );
+               shell.setText( getText() );
+               createContents();
+               shell.pack();
+               
+               TreeItemData treeItemData = (TreeItemData) dataSourceTreeItem.getData("TREEITEMDATA");
+        
+        if (treeItemData != null) {
+            loadParentData( treeItemData );
+        }
+               
+               shell.open();
+               Display display = getParent().getDisplay();
+               while ( !shell.isDisposed() ) {
+                       if (!display.readAndDispatch()) {
+                               display.sleep();
+                       }
+               }
+               return message;
+       }
+
+       /**
+        * Creates the dialog's contents
+        */
+       private void createContents() {
+
+               FormLayout layout = new FormLayout();
+        shell.setLayout(layout);
+        layout.marginWidth = 5;
+        layout.marginHeight = 5;
+        
+               Group typeGroup = makeTypeGroup( shell );
+               Group baseGroup = makeBaseGroup( shell, typeGroup );
+               
+               sashForm = new SashForm(baseGroup, SWT.HORIZONTAL);
+        
+        FormData sashData = new FormData();
+        sashData.top = new FormAttachment( 0, 0);
+        sashData.bottom = new FormAttachment(100, -5);
+        sashData.left = new FormAttachment(0, 0);
+        sashData.right = new FormAttachment(100, -5);
+        sashForm.setLayoutData( sashData );
+        
+        Group settingGroup = new Group(sashForm, SWT.NONE);
+        dataModelGroup = new Group(sashForm, SWT.NONE);
+        
+        sashForm.setWeights(new int[] {2, 3});
+        
+        makeDataModelGroup( dataModelGroup );
+        makeSettingGroup( settingGroup );
+               
+               // Create the cancel button and add a handler
+               // so that pressing it will set input to null
+               Button cancelButton = new Button( shell, SWT.PUSH );
+               cancelButton.setText( "CANCEL" );
+               
+               FormData data = new FormData( 100, 30 );
+               data.top = new FormAttachment( baseGroup, 5 );
+               data.right = new FormAttachment( 100, -5 );
+               data.bottom = new FormAttachment( 100, -5 );
+               
+               cancelButton.setLayoutData( data );
+               
+               cancelButton.addSelectionListener( new SelectionAdapter() {
+                       public void widgetSelected( SelectionEvent event ) {
+                               message = null;
+                               shell.close();
+                       }
+               } );
+
+               // Create the OK button and add a handler
+               // so that pressing it will set input
+               // to the entered value
+               Button okButton = new Button( shell, SWT.PUSH );
+               okButton.setText( "OK" );
+               
+               data = new FormData( 100, 30 );
+               data.top = new FormAttachment( baseGroup, 5 );
+               data.right = new FormAttachment( cancelButton, -5 );
+               data.bottom = new FormAttachment( 100, -5 );
+               
+               okButton.setLayoutData( data );
+               
+               okButton.addSelectionListener( new SelectionAdapter() {
+                       
+                   public void widgetSelected( SelectionEvent event ) {
+                               
+                       BindingData dataModel = currentSubPage.getData();
+                               dataModel.setModelType( dataTypeCombo.getText().toUpperCase() );
+                               dataModel.setUpdateOnStartup( updateOnStartUp.getSelection() );
+                               dataModel.setSourceName( dataSourceTreeItem.getText() );
+
+                               TreeItemData treeItemData = (TreeItemData) dataSourceTreeItem.getData( "TREEITEMDATA" );
+                               if (treeItemData == null) {
+                                       treeItemData = new TreeItemData();
+                               }
+                               treeItemData.setModel( dataModel );
+                               dataSourceTreeItem.setData( "TREEITEMDATA", treeItemData );
+
+                               dataSourceTreeItem.removeAll();
+
+                               JsonObject root = new JsonObject();
+                               TreeItem[] treeItems = dialogTree.getItems();
+                               for (TreeItem item : treeItems) {
+                    Helper.makeJsonFromTree( item, root);
+                }
+                               Helper.makeTreeItem(root, null, dataSourceTreeItem, false);
+                               message = "OK";
+                               shell.close();
+                       }
+               } );
+
+               // Set the OK button as the default, so
+               // user can type input and press Enter
+               // to dismiss
+               // shell.setDefaultButton(okButton);
+       }
+       
+       private void loadParentData(TreeItemData treeItemData) {
+           BindingData dataModel = treeItemData.getModel();
+           currentSubPage =null;
+        if (dataModel != null) {
+            if (dataModel.getModelType().equals("STATIC")) {
+                dataTypeCombo.select(0);
+                currentSubPage = staticSubPage;
+            } else if (dataModel.getModelType().equals("REMOTE CALL")) {
+                dataTypeCombo.select(1);
+                currentSubPage = remoteCallSubPage;
+            } else if (dataModel.getModelType().equals("RUNTIME API")) {
+                dataTypeCombo.select(2);
+                currentSubPage = runtimeAPISubPage;
+            } else {
+                dataTypeCombo.select(3);
+                currentSubPage = fileSystemSubPage;
+            }
+            
+            Composite settingComposite = currentSubPage.getSettingComposite();
+            setttingStackLayout.topControl = settingComposite;
+            currentSubPage.setButtonsState(dataButtonMap);
+            settingComposite.getParent().layout();
+            
+            currentSubPage.loadData( dataModel );
+        }
+    }
+
+    private Group makeTypeGroup(final Shell shell) {
+        Group typeGroup = new Group(shell, SWT.NONE);
+        typeGroup.setText("Data Type");
+        
+        FormLayout importLayout = new FormLayout();
+        importLayout.marginWidth = 5;
+        importLayout.marginHeight = 5;
+        typeGroup.setLayout(importLayout);
+        
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 5);
+        data.left = new FormAttachment(0, 5);
+        typeGroup.setLayoutData(data);
+
+        dataTypeCombo = new Combo(typeGroup, SWT.READ_ONLY);
+        data = new FormData(150, 30);
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        dataTypeCombo.setLayoutData(data);
+        
+//        String items[] = { "Static", "Remote Call", "Runtime API", "File System" };
+        String items[] = { "Static", "Remote Call", "Runtime API" };
+        
+        dataTypeCombo.setItems(items);
+        dataTypeCombo.select(0);
+
+        dataTypeCombo.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent e) {
+
+                int settingWeight = 3;
+                int shshWidth =1;
+                Composite dataCompositeParent = dataModelGroup;
+                
+                if (dataTypeCombo.getText().equals("Static")) {
+                    currentSubPage = staticSubPage;
+                    settingWeight = 0;
+                    shshWidth = 0;
+                    dataCompositeParent = staticSubPage.getDataComposite();
+                } else if (dataTypeCombo.getText().equals("Remote Call")) {
+                    currentSubPage = remoteCallSubPage;
+                } else if (dataTypeCombo.getText().equals("Runtime API")) {
+                    currentSubPage = runtimeAPISubPage;
+                } else if (dataTypeCombo.getText().equals("File System")) {
+                    currentSubPage = fileSystemSubPage;
+                }
+                
+                sashForm.setWeights(new int[] {2, settingWeight});
+                sashForm.setSashWidth(shshWidth);
+                dataComposite.setParent( dataCompositeParent );
+                dataComposite.getParent().layout();
+                
+                Composite composite = currentSubPage.getSettingComposite();
+                setttingStackLayout.topControl =  composite;
+                composite.getParent().layout();
+                
+                currentSubPage.setButtonsState(dataButtonMap);
+                
+                for (Control control : dialogTree.getChildren()) {
+                    control.dispose();
+                }
+                
+                dialogTree.removeAll();
+            }
+        });
+
+        updateOnStartUp = new Button(typeGroup, SWT.CHECK);
+        data = new FormData();
+        data.top = new FormAttachment(dataTypeCombo, 5);
+
+        updateOnStartUp.setText("Update on Start Up");
+        updateOnStartUp.setLayoutData(data);
+        updateOnStartUp.setSelection(true);
+
+        return typeGroup;
+    }
+       
+        private Group makeBaseGroup(Shell shell, Group typeGroup) {
+        Group mainGroup = new Group(shell, SWT.NONE);
+
+        FormLayout mainLayout = new FormLayout();
+        mainLayout.marginWidth = 5;
+        mainLayout.marginHeight = 5;
+        
+        FormData mainFormData = new FormData();
+        mainFormData.top = new FormAttachment(typeGroup,5 );
+        mainFormData.bottom = new FormAttachment(100, -35);
+        mainFormData.left = new FormAttachment(0, 0);
+        mainFormData.right = new FormAttachment(100, 0);
+        
+        mainGroup.setLayout(mainLayout);
+        mainGroup.setLayoutData(mainFormData);
+        
+        return mainGroup;
+    }
+
+        private Group makeDataModelGroup( Group dataGroup ) {
+                
+            dataGroup.setText( "Data Model" );
+            FormLayout layout = new FormLayout();
+            dataGroup.setLayout(layout);
+            
+            dataComposite = new Composite(dataGroup, SWT.NONE);
+                
+            FormData data = new FormData();
+         data.top = new FormAttachment(0,0);
+         data.left = new FormAttachment(0, 0);
+         data.right = new FormAttachment(100,0);
+         data.bottom = new FormAttachment(100, 0);
+         dataComposite.setLayoutData( data );
+         
+                layout = new FormLayout();
+                dataComposite.setLayout(layout);
+                
+                makeDataButtons(dataComposite);
+                
+                treeComposite = new Composite(dataComposite, SWT.NONE);
+                data = new FormData();
+            data.top = new FormAttachment(dataButtonMap.get("expandAll"), 2);
+            data.left = new FormAttachment(0, 0);
+            data.right = new FormAttachment(dataButtonMap.get("addTreeItem"), -5);
+            data.bottom = new FormAttachment(100, 0);
+            treeComposite.setLayoutData( data );
+            
+                dataStackLayout = new StackLayout();
+                treeComposite.setLayout(dataStackLayout);
+                
+                makeDataTree(treeComposite);
+                
+                dataStackLayout.topControl = dialogTree;
+                
+                dataGroup.layout();
+                return dataGroup;
+        }
+       
+        private void makeDataButtons( Composite dataGroup ) {
+           
+        Button expandAllButton = new Button(dataGroup, SWT.PUSH);
+        expandAllButton.setText("E");
+        expandAllButton.setToolTipText( "Expand All Fields" );
+        
+        FormData data = new FormData();
+        data.top = new FormAttachment(2, 0);
+        data.left = new FormAttachment(0, 0);
+        
+        expandAllButton.setLayoutData(data);
+        dataButtonMap.put("expandAll", expandAllButton);
+        
+        SelectionAdapter adapter = new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                boolean isExpand;
+                Button bt = (Button) e.getSource();
+                if(bt.getData( "expand" ) != null && (Boolean)bt.getData( "expand" ) ){
+                    isExpand = true;
+                }else{
+                    isExpand = false;
+                }
+                
+                for (TreeItem treeItem : dialogTree.getItems()) {
+                    doExpend(treeItem, isExpand);
+                }
+            }
+            
+            private void doExpend(TreeItem treeItems, boolean expand ){
+                treeItems.setExpanded(expand);
+                for (TreeItem treeItem : treeItems.getItems()) {
+                    doExpend(treeItem, expand);
+                }
+            }
+        };
+        expandAllButton.setData( "expand", true );
+        expandAllButton.addSelectionListener( adapter );
+        
+        Button collapseAllButton = new Button(dataGroup, SWT.PUSH);
+        collapseAllButton.setText("C");
+        collapseAllButton.setToolTipText( "Collapse All Fields" );
+        collapseAllButton.setData( "expand", false );
+        collapseAllButton.addSelectionListener( adapter );
+        
+        data = new FormData();
+        data.top = new FormAttachment(2, 0);
+        data.left = new FormAttachment(expandAllButton, 2);
+        
+        collapseAllButton.setLayoutData(data);
+        dataButtonMap.put("collapseAll", collapseAllButton);
+        
+        Button addTreeItemButton = new Button(dataGroup, SWT.PUSH);
+        addTreeItemButton.setText("A");
+        addTreeItemButton.setToolTipText("Add");
+        
+        data = new FormData();
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(expandAllButton, 2);
+        data.right = new FormAttachment(100, 0);
+        addTreeItemButton.setLayoutData(data);
+        
+        addTreeItemButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                addItem();
+            }
+        });
+        dataButtonMap.put("addTreeItem", addTreeItemButton);
+
+        Button upTreeItemButton = new Button(dataGroup, SWT.PUSH);
+        upTreeItemButton.setText("U");
+        upTreeItemButton.setToolTipText("Up");
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(addTreeItemButton, 5);
+        data.left = new FormAttachment(addTreeItemButton, 0, SWT.LEFT);
+        upTreeItemButton.setLayoutData(data);
+        
+        upTreeItemButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                moveItem(true);
+            }
+        });
+        dataButtonMap.put("upTreeItem", upTreeItemButton);
+
+        Button downTreeItemButton = new Button(dataGroup, SWT.PUSH);
+        downTreeItemButton.setText("D");
+        downTreeItemButton.setToolTipText("Down");
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(upTreeItemButton, 5);
+        data.left = new FormAttachment(addTreeItemButton, 0, SWT.LEFT);
+        
+        downTreeItemButton.setLayoutData(data);
+        downTreeItemButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                moveItem(false);
+            }
+        });
+        dataButtonMap.put("downTreeItem", downTreeItemButton);
+
+        Button removeTreeItemButton = new Button(dataGroup, SWT.PUSH);
+        removeTreeItemButton.setText("R");
+        removeTreeItemButton.setToolTipText("Remove");
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(downTreeItemButton, 5);
+        data.left = new FormAttachment(addTreeItemButton, 0, SWT.LEFT);
+        
+        removeTreeItemButton.setLayoutData(data);
+        removeTreeItemButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                removeItem();
+            }
+        });
+        dataButtonMap.put("removeTreeItem", removeTreeItemButton);
+
+        Button removeAllTreeItemButton = new Button(dataGroup, SWT.PUSH);
+        removeAllTreeItemButton.setText("RA");
+        removeAllTreeItemButton.setToolTipText("Remove All");
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(removeTreeItemButton, 5);
+        data.left = new FormAttachment(addTreeItemButton, 0, SWT.LEFT);
+        removeAllTreeItemButton.setLayoutData(data);
+
+        removeAllTreeItemButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                removeAllItems();
+            }
+        });
+        dataButtonMap.put("removeAllTreeItem", removeAllTreeItemButton);
+
+        Button conversionButtonBetweenTreeAndText = new Button(dataGroup, SWT.TOGGLE);
+        conversionButtonBetweenTreeAndText.setText("V");
+        conversionButtonBetweenTreeAndText.setToolTipText("View Source");
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(removeAllTreeItemButton, 5);
+        data.left = new FormAttachment(addTreeItemButton, 0, SWT.LEFT);
+        conversionButtonBetweenTreeAndText.setLayoutData(data);
+        
+        conversionButtonBetweenTreeAndText.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                Button button = (Button) event.getSource();
+                
+                if (button.getSelection()) {
+                    button.setToolTipText( "View Tree" );
+                       dataStackLayout.topControl = remoteCallSubPage.getDataSourceStyledText();
+                } else {
+                    dataStackLayout.topControl = dialogTree;
+                    button.setToolTipText( "View Source" );
+                }
+                currentSubPage.setButtonsState(dataButtonMap);
+                dialogTree.getParent().layout();
+            }
+        });
+        dataButtonMap.put("conversionTreeAndText", conversionButtonBetweenTreeAndText);
+    }
+
+       private void makeDataTree( Composite treeComposite ) {
+               
+           Button expandAll = new Button( treeComposite, SWT.PUSH );
+           expandAll.setText( "E" );
+           expandAll.setToolTipText( "Exapnd All fields" );
+           
+           FormData data = new FormData();
+        data.top = new FormAttachment(2, 0);
+        data.left = new FormAttachment(0, 0);
+        
+        expandAll.setLayoutData(data);
+           
+               dialogTree = new Tree(treeComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION );
+
+               dialogTree.setLinesVisible(true);
+               dialogTree.setHeaderVisible(true);
+               
+               data = new FormData();
+        data.top = new FormAttachment(expandAll, 2);
+        data.left = new FormAttachment(0, 0);
+        dialogTree.setLayoutData(data);
+        
+        TreeColumn column1 = new TreeColumn(dialogTree, SWT.LEFT);
+        column1.setText("Field");
+        column1.setWidth(125);
+        TreeColumn column2 = new TreeColumn(dialogTree, SWT.LEFT);
+        column2.setText("Data");
+        column2.setWidth(120);
+        TreeColumn column3 = new TreeColumn(dialogTree, SWT.LEFT);
+        column3.setText("Type");
+        column3.setWidth(80);
+        
+        dialogTree.addControlListener( new ControlListener() {
+            @Override
+            public void controlResized(ControlEvent e) {
+                Tree tree = (Tree) e.getSource();
+                int widthSum = 0;
+                for (int i = 1; i < tree.getColumnCount(); i++) {
+                    widthSum += tree.getColumn(i).getWidth();
+                }
+                tree.getColumn(0).setWidth(tree.getClientArea().width - widthSum );
+            }
+            @Override
+            public void controlMoved(ControlEvent e) {
+            }
+        });
+        
+        final TreeEditor treeEditor = new TreeEditor(dialogTree);
+        treeEditor.horizontalAlignment = SWT.LEFT;
+        treeEditor.grabHorizontal = true;
+
+        dialogTree.addMouseListener(new MouseAdapter() {
+            public void mouseDoubleClick(MouseEvent e) {
+                Point point = new Point(e.x, e.y);
+                final TreeItem treeItem = dialogTree.getItem(point);
+                if (treeItem == null) {
+                    dialogTree.deselectAll();
+                    return;
+                }
+                
+                for (int i = 0; i < dialogTree.getColumnCount(); i++) {// this is the column that was clicked
+                    final int column = i;
+                    Rectangle rect = treeItem.getBounds(column);
+                    if (rect.contains(point)) {
+                        
+                        TreeItemData data = (TreeItemData) treeItem.getData( "TREEITEMDATA" );
+                       
+                        if( data.getSource().equals( "original" ) && column != 1 ){
+                               return;
+                       }else if( !types.contains( data.getObjectType() ) )
+                               return;
+                               
+                        Control oldEditor = treeEditor.getEditor();
+                        if (oldEditor != null) {
+                            oldEditor.dispose();
+                        }
+
+                        // Create a text field to do the editing
+                        final Text text = new Text(dialogTree, SWT.NONE);
+                        text.setText(treeItem.getText(column));
+                        text.selectAll();
+                        text.setFocus();
+
+                        // If the text field loses focus, set its text into the
+                        // tree
+                        // and end the editing session
+                        text.addFocusListener(new FocusAdapter() {
+                            public void focusLost(FocusEvent event) {
+                                treeItem.setText(column, text.getText());
+                                text.dispose();
+                            }
+                        });
+
+                        // If they hit Enter, set the text into the tree and end
+                        // the editing
+                        // session. If they hit Escape, ignore the text and end
+                        // the editing
+                        // session
+                        text.addKeyListener(new KeyAdapter() {
+                            public void keyPressed(KeyEvent event) {
+                                switch (event.keyCode) {
+                                    case SWT.CR:
+                                        treeItem.setText(column, text.getText());
+                                        break;
+                                    case SWT.KEYPAD_CR:
+                                        // Enter hit--set the text into the tree and
+                                        // drop through
+                                        treeItem.setText(column, text.getText());
+                                        break;
+                                    case SWT.ESC:
+                                        // End editing session
+                                        text.dispose();
+                                        break;
+                                }
+                            }
+                        });
+
+                        treeEditor.setEditor(text, treeItem, column);
+                    }
+                }
+            }
+        });
+
+        // Add a key listener to the tree that listens for F2.
+        // If F2 is pressed, we do the editing
+        dialogTree.addKeyListener(new KeyAdapter() {
+            public void keyPressed(KeyEvent event) {
+                // Make sure one and only one item is selected when F2 is
+                // pressed
+                if (event.keyCode == SWT.F2 && dialogTree.getSelectionCount() == 1) {
+                    // Determine the item to edit
+                    final TreeItem item = dialogTree.getSelection()[0];
+                    TreeItemData data = (TreeItemData) item.getData( "TREEITEMDATA" );
+                    
+                    if( data.getSource().equals( "original" ) ){
+                               return;
+                       }else if( !types.contains( data.getObjectType() ) )
+                               return;
+                    
+                    Control oldEditor = treeEditor.getEditor();
+                    if (oldEditor != null) {
+                        oldEditor.dispose();
+                    }
+
+                    // Create a text field to do the editing
+                    final Text text = new Text(dialogTree, SWT.NONE);
+                    text.setText(item.getText());
+                    text.selectAll();
+                    text.setFocus();
+
+                    // If the text field loses focus, set its text into the tree
+                    // and end the editing session
+                    text.addFocusListener(new FocusAdapter() {
+                        public void focusLost(FocusEvent event) {
+                            item.setText(text.getText());
+                            text.dispose();
+                        }
+                    });
+
+                    // If they hit Enter, set the text into the tree and end the
+                    // editing
+                    // session. If they hit Escape, ignore the text and end the
+                    // editing
+                    // session
+                    text.addKeyListener(new KeyAdapter() {
+                        public void keyPressed(KeyEvent event) {
+                            switch (event.keyCode) {
+                                case SWT.CR:
+                                case SWT.KEYPAD_CR:
+                                    // Enter hit--set the text into the tree and
+                                    // drop through
+                                    item.setText(text.getText());
+                                    break;
+                                case SWT.ESC:
+                                    // End editing session
+                                    text.dispose();
+                                    break;
+                            }
+                        }
+                    });
+
+                    // Set the text field into the editor
+                    treeEditor.setEditor(text, item);
+                }
+            }
+        });
+
+        DataBindingDnDManager.addDragAndDropListenerToTree(dialogTree);
+       }
+
+       private Group makeSettingGroup( Group settingGroup ) {
+                
+               settingGroup.setText( "Setting" );
+                
+               setttingStackLayout = new StackLayout();
+               settingGroup.setLayout(setttingStackLayout);
+        
+               staticSubPage = new StaticSubPage(settingGroup, dialogTree );
+               remoteCallSubPage =  new RemoteCallSubPage(settingGroup, dialogTree );
+               runtimeAPISubPage = new RuntimeAPISubPage(settingGroup, dialogTree ); 
+               fileSystemSubPage = new FileSystemSubPage(settingGroup, dialogTree);
+               
+               currentSubPage = staticSubPage;
+               setttingStackLayout.topControl = staticSubPage.getSettingComposite();
+               
+               sashForm.setWeights(new int[] {2, 0});
+               sashForm.setSashWidth(0);
+               dataComposite.setParent( staticSubPage.getDataComposite() );
+               
+               staticSubPage.setButtonsState( dataButtonMap );
+
+        return settingGroup;
+    }
+
+       private CCombo addComboInTreeItem(TreeItem item, String data) {
+        TreeEditor treeEditor = new TreeEditor(dialogTree);
+        CCombo combo = new CCombo(dialogTree, SWT.SINGLE | SWT.BORDER | SWT.FLAT | SWT.READ_ONLY);
+        String[] comboItems = { "String", "Number", "Boolean", "Object", "Array" };
+        combo.setItems(comboItems);
+        combo.select( Arrays.asList(comboItems).indexOf(data) );
+        combo.pack();
+        
+        combo.addSelectionListener(new SelectionListener() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                CCombo combo = (CCombo) e.getSource();
+                TreeEditor treeEditor = (TreeEditor) ((Tree)combo.getParent()).getSelection()[0].getData( "TREEEDITORFORCOMBO" );
+                String[] comboItems = { "String", "Number", "Boolean", "Object", "Array" };
+                treeEditor.getItem().setText(2, comboItems[combo.getSelectionIndex()]);
+            }
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+            }
+        });
+
+        treeEditor.minimumWidth = dialogTree.getColumn(2).getWidth();
+        treeEditor.horizontalAlignment = SWT.CENTER;
+        treeEditor.setEditor(combo, item, 2);
+
+        item.setData("TREEEDITORFORCOMBO", treeEditor);
+
+        return combo;
+    }
+       
+       private void addItem() {
+           TreeItem parentItem = null;
+        
+           if( dialogTree.getSelection().length > 0 )
+            parentItem = dialogTree.getSelection()[0];
+        
+        TreeItem item;
+        if (parentItem == null) {
+            item = new TreeItem(dialogTree, SWT.NONE);
+        } else {
+            item = new TreeItem(parentItem, SWT.NONE);
+        }
+        item.setText(new String[] { "data", "test", "String" });
+        
+        TreeItemData treeItemData = new TreeItemData();
+        treeItemData.setSource( "custom" );
+        treeItemData.setObjectType("String");
+        treeItemData.setObjectValue("String");
+        
+        item.setData("TREEITEMDATA", treeItemData);
+        
+        addComboInTreeItem(item, "String");
+        dialogTree.showItem(item);
+    }
+       
+       private void removeAllItems() {
+        TreeItem[] treeItems = dialogTree.getItems();
+        if (treeItems.length != 0) {
+            for (TreeItem treeItem : treeItems) {
+                removeAllChildrenRecursively(treeItem);
+            }
+        }
+    }
+       
+       private void removeItem() {
+        TreeItem[] treeItems = dialogTree.getSelection();
+        for (TreeItem treeItem : treeItems) {
+            removeAllChildrenRecursively(treeItem);
+        }
+        // for redraw
+        dialogTree.setSize(dialogTree.getSize().x, dialogTree.getSize().y - 1);
+        dialogTree.setSize(dialogTree.getSize().x, dialogTree.getSize().y + 1);
+    }
+
+    private void removeAllChildrenRecursively(TreeItem treeItem) {
+        TreeItem[] treeItems = treeItem.getItems();
+
+        if (treeItems.length != 0) {
+            for (TreeItem item : treeItems) {
+                removeAllChildrenRecursively(item);
+            }
+        }
+        TreeItemData data = (TreeItemData) treeItem.getData( "TREEITEMDATA" );
+        
+        if( data != null && data.getSource().equals( "original" ) )
+            return;
+
+        TreeEditor editor = (TreeEditor) treeItem.getData("TREEEDITORFORCOMBO");
+        if (editor != null) {
+            editor.getEditor().dispose();
+            editor.dispose();
+        }
+        treeItem.dispose();
+    }
+    
+    private void moveItem(boolean option) {
+        
+        if (dialogTree.getSelection().length > 0) {
+            
+            int columnCount = dialogTree.getColumnCount();
+            String[] str = new String[columnCount];
+            TreeItemData data = (TreeItemData) dialogTree.getSelection()[0].getData( "TREEITEMDATA" );
+            
+            for (int i = 0; i < columnCount; i++) {
+                str[i] = dialogTree.getSelection()[0].getText(i);
+            }
+
+            TreeItem item;
+            
+            if (option) {
+                item = moveItemToUp(dialogTree.getSelection()[0], false);
+            } else {
+                item = moveItemToBottom(dialogTree.getSelection()[0], false);
+            }
+            
+            DataBindingDnDManager.setChildItems(item, dialogTree.getSelection()[0].getItems());
+
+            dialogTree.getSelection()[0].dispose();
+            item.setText(str);
+            item.setData( "TREEITEMDATA", data);
+            dialogTree.select(item);
+        }
+    }
+    
+    private TreeItem moveItemToBottom(TreeItem selectedItem, boolean downToChild) {
+        TreeItem parentItem = selectedItem.getParentItem();
+        TreeItem item;
+
+        if (parentItem == null) {
+            int index = dialogTree.indexOf(selectedItem);
+            int itemCount = dialogTree.getItemCount();
+
+            if (index == itemCount - 1) {
+                if (downToChild) {
+                    item = new TreeItem(dialogTree, SWT.NONE, index + 1);
+                } else {
+                    item = new TreeItem(dialogTree, SWT.NONE, index);
+                }
+
+            } else {
+                if (dialogTree.getItem(index + 1).getExpanded()) {
+                    item = new TreeItem(dialogTree.getItem(index + 1), SWT.NONE, 0);
+                } else {
+                    if (downToChild) {
+                        item = new TreeItem(dialogTree, SWT.NONE, index + 1);
+                    } else {
+                        item = new TreeItem(dialogTree, SWT.NONE, index + 2);
+                    }
+                }
+            }
+        } else {
+            int index = parentItem.indexOf(selectedItem);
+            int itemCount = parentItem.getItemCount();
+
+            if (index == itemCount - 1) {
+                if (downToChild) {
+                    item = new TreeItem(parentItem, SWT.NONE, index + 1);
+                } else {
+                    item = moveItemToBottom(parentItem, true);
+                }
+            } else {
+                if (parentItem.getItem(index + 1).getExpanded()) {
+                    item = new TreeItem(parentItem.getItem(index + 1), SWT.NONE, 0);
+                } else {
+                    if (downToChild) {
+                        item = new TreeItem(parentItem, SWT.NONE, index + 1);
+                    } else {
+                        item = new TreeItem(parentItem, SWT.NONE, index + 2);
+                    }
+                }
+            }
+
+        }
+        return item;
+    }
+
+    private TreeItem moveItemToUp(TreeItem selectedItem, boolean upToParent) {
+        TreeItem parentItem = selectedItem.getParentItem();
+        TreeItem item;
+
+        if (parentItem == null) {
+            int index = dialogTree.indexOf(selectedItem);
+
+            if (index == 0) {
+                item = new TreeItem(dialogTree, SWT.NONE, index);
+            } else {
+                if (dialogTree.getItem(index - 1).getExpanded()) {
+                    int itemCount = dialogTree.getItem(index - 1).getItemCount();
+                    item = new TreeItem(dialogTree.getItem(index - 1), SWT.NONE, itemCount);
+                } else {
+                    if (upToParent) {
+                        item = new TreeItem(dialogTree, SWT.NONE, index);
+                    } else {
+                        item = new TreeItem(dialogTree, SWT.NONE, index - 1);
+                    }
+                }
+            }
+        } else {
+            int index = parentItem.indexOf(selectedItem);
+
+            if (index == 0) {
+                if (upToParent) {
+                    item = new TreeItem(parentItem, SWT.NONE, index);
+                } else {
+                    item = moveItemToUp(parentItem, true);
+                }
+            } else {
+                if (parentItem.getItem(index - 1).getExpanded()) {
+                    int itemCount = parentItem.getItem(index - 1).getItemCount();
+                    item = new TreeItem(parentItem.getItem(index - 1), SWT.NONE, itemCount);
+                } else {
+                    if (upToParent) {
+                        item = new TreeItem(parentItem, SWT.NONE, index);
+                    } else {
+                        item = new TreeItem(parentItem, SWT.NONE, index - 1);
+                    }
+                }
+            }
+        }
+        return item;
+    }
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/SourceDialogSubPage.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/SourceDialogSubPage.java
new file mode 100644 (file)
index 0000000..c0149cb
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * UI Builder
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.util.Map;
+
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+
+public interface SourceDialogSubPage {
+       
+       public BindingData getData();
+
+       public Composite getSettingComposite();
+
+    public void setButtonsState(Map<String, Button> dataButtonMap);
+
+    public void loadData(BindingData dataModel);
+}
diff --git a/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/StaticSubPage.java b/org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/dialog/StaticSubPage.java
new file mode 100644 (file)
index 0000000..a399b25
--- /dev/null
@@ -0,0 +1,388 @@
+/*
+ * UI Builder
+ *
+ * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Contributors:
+ * - S-Core Co., Ltd
+ *
+ */
+package org.tizen.webuibuilder.ui.views.databinding.dialog;
+
+import java.io.ByteArrayInputStream;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.jsdt.internal.ui.javaeditor.CompilationUnitEditor;
+import org.tizen.webuibuilder.ui.editor.MemoryEditorInput;
+import org.tizen.webuibuilder.ui.views.databinding.model.BindingData;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+
+@SuppressWarnings("restriction")
+public class StaticSubPage implements SourceDialogSubPage {
+
+       private Group parentGroup;
+       private Tree parentDataTree;
+       private Composite settingComposite;
+       private Composite dataComposite;
+       
+       private StyledText staticSourceStyledText;
+       private String jsonFile;
+       private String jsonString;
+       private static Gson prettyGson;
+       private static Gson normalGson;
+       
+       static{
+           prettyGson = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
+           normalGson = new GsonBuilder().serializeNulls().create();
+       }
+       
+       public StaticSubPage( Group dataGroup, Tree dialogTree) {
+           parentGroup = dataGroup;
+        parentDataTree = dialogTree;
+    }
+
+    @Override
+       public BindingData getData() {
+               BindingData dataModel = new BindingData();
+               
+               JsonObject root = new JsonObject();
+        TreeItem[] items = parentDataTree.getItems();
+        for (TreeItem item : items) {
+            Helper.makeJsonFromTree( item, root);
+        }
+        
+               dataModel.setJsonData( normalGson.toJson(root) );
+        dataModel.setStaticFilePath(jsonFile);
+        
+               return dataModel;
+       }
+       
+       @Override
+       public Composite getSettingComposite() {
+               if( settingComposite == null ){
+                       createSettingComposite();
+               }
+               
+               staticSourceStyledText.setText( "" );
+               
+               return settingComposite;
+       }
+
+       private void createSettingComposite() {
+           
+               settingComposite = new Composite(parentGroup, SWT.NONE);
+        settingComposite.setLayout( new FormLayout() );
+        
+        FormData data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(100, 0);
+        data.bottom = new FormAttachment(100, 0);
+        settingComposite.setLayoutData(data);
+        
+        SashForm sashForm = new SashForm(settingComposite, SWT.HORIZONTAL);
+        data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(100, 0);
+        data.bottom = new FormAttachment(100, 0);
+        sashForm.setLayoutData(data);
+        
+        Composite subSettingComposite = new Composite(sashForm, SWT.NONE);
+        subSettingComposite.setLayout(new FormLayout());
+        
+        dataComposite = new Composite(sashForm, SWT.NONE);
+        dataComposite.setLayout( new FormLayout() );
+        
+        data = new FormData();
+        data.top = new FormAttachment(0, 0);
+        data.right = new FormAttachment(3, 0);
+        data.right = new FormAttachment(100, 0);
+        data.bottom = new FormAttachment(100, 0);
+        dataComposite.setLayoutData(data);
+        
+        sashForm.setWeights(new int[] {2, 3});
+        
+        Button formatButton = new Button(subSettingComposite, SWT.PUSH);
+        formatButton.setText("F");
+        formatButton.setToolTipText( "Format JSON Data" );
+        
+        data = new FormData();
+        data.top = new FormAttachment(2, 0);
+        data.left = new FormAttachment(0, 0);
+        
+        formatButton.setLayoutData(data);
+        
+        formatButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                JsonObject jo = prettyGson.fromJson(staticSourceStyledText.getText(), JsonObject.class);
+                staticSourceStyledText.setText( prettyGson.toJson(jo) );
+            }
+        });
+        
+        Button compactButton = new Button(subSettingComposite, SWT.PUSH);
+        compactButton.setText("C");
+        compactButton.setToolTipText( "Compact JSON Data" );
+        
+        data = new FormData();
+        data.top = new FormAttachment(2, 0);
+        data.left = new FormAttachment(formatButton, 2);
+        
+        compactButton.setLayoutData(data);
+        
+        compactButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                JsonObject jo = normalGson.fromJson(staticSourceStyledText.getText(), JsonObject.class);
+                staticSourceStyledText.setText( normalGson.toJson(jo) );
+            }
+        });
+        
+        Button openFileButton = new Button(subSettingComposite, SWT.PUSH);
+        openFileButton.setText("O");
+        openFileButton.setToolTipText( "Open" );
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(formatButton, 2);
+        data.right = new FormAttachment(100, -2);
+        
+        openFileButton.setLayoutData(data);
+        
+        SelectionAdapter fileOpenSelectionAdapter =  new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+               
+               Button sourceButton = (Button) event.getSource();
+               
+               if( sourceButton.getToolTipText().equals( "Open" ) ){
+                       FileDialog fileDialog = new FileDialog(parentGroup.getShell(), SWT.OPEN);
+
+                    String file = fileDialog.open();
+                    if (file == null) {
+                        return;
+                    }
+                    
+                    jsonFile = file;
+               }
+
+                JsonObject json = Helper.readJsonFromFile( jsonFile );
+                
+                if (json != null) {
+                    jsonString = prettyGson.toJson( json );
+                    staticSourceStyledText.setText( jsonString );
+                }else{
+                    jsonString = "";
+                    staticSourceStyledText.setText( "" );
+                    for( Control control : parentDataTree.getChildren() ){
+                        control.dispose();
+                    }
+                    parentDataTree.removeAll();
+                }
+            }
+        };
+        
+        openFileButton.addSelectionListener(fileOpenSelectionAdapter);
+
+        Button reloadFileButton = new Button(subSettingComposite, SWT.PUSH);
+        reloadFileButton.setText("R");
+        reloadFileButton.setToolTipText( "Reload" );
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(openFileButton, 5);
+        data.left = new FormAttachment(openFileButton, 0, SWT.LEFT);
+        
+        reloadFileButton.setLayoutData(data);
+        reloadFileButton.addSelectionListener(fileOpenSelectionAdapter);
+
+        Button clearButton = new Button(subSettingComposite, SWT.PUSH);
+        clearButton.setText("C");
+        clearButton.setToolTipText( "Clear" );
+        
+        data = new FormData(25, 25);
+        data.top = new FormAttachment(reloadFileButton, 5);
+        data.left = new FormAttachment(openFileButton, 0, SWT.LEFT);
+        
+        clearButton.setLayoutData(data);
+        clearButton.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent event) {
+                staticSourceStyledText.setText("");
+            }
+        });
+
+//        Button submitJsonButton = new Button(subSettingComposite, SWT.PUSH);
+//        submitJsonButton.setText("<-");
+//        submitJsonButton.setToolTipText( "submit to source" );
+//        
+//        data = new FormData(25, 25);
+//        data.top = new FormAttachment(clearButton, 5);
+//        data.left = new FormAttachment(openFileButton, 0, SWT.LEFT);
+//  
+//        submitJsonButton.setLayoutData(data);
+//        submitJsonButton.addSelectionListener(new SelectionAdapter() {
+//            public void widgetSelected(SelectionEvent event) {
+//                if (parentDataTree.getItemCount() > 0 ) {
+//                    JsonObject root = new JsonObject();
+//                    TreeItem[] items = parentDataTree.getItems();
+//                    for (TreeItem item : items) {
+//                        Helper.makeJsonFromTree( item, root);
+//                    }
+//                    
+//                    jsonString = prettyGson.toJson(root);
+//                    staticSourceStyledText.setText(jsonString);
+//                }
+//            }
+//        });
+//        
+//        Button submitTreeButton = new Button(subSettingComposite, SWT.PUSH);
+//        submitTreeButton.setText("->");
+//        submitTreeButton.setToolTipText( "submit to tree" );
+//        
+//        data = new FormData(25, 25);
+//        data.top = new FormAttachment(submitJsonButton, 5);
+//        data.left = new FormAttachment(openFileButton, 0, SWT.LEFT);
+//  
+//        submitTreeButton.setLayoutData(data);
+//        submitTreeButton.addSelectionListener(new SelectionAdapter() {
+//            public void widgetSelected(SelectionEvent event) {
+//                for (Control control : parentDataTree.getChildren()) {
+//                    control.dispose();
+//                }
+//             parentDataTree.removeAll();
+//                if (!staticSourceStyledText.getText().equalsIgnoreCase("")) {
+//                    jsonString = staticSourceStyledText.getText();
+//                    makeTreeFromJsonText(jsonString, null);
+//                }
+//            }
+//        });
+        
+        Composite composite = new Composite( subSettingComposite, SWT.NONE );
+        
+        data = new FormData(220,310);
+        data.top = new FormAttachment(formatButton, 2);
+        data.bottom = new FormAttachment(100, -10);
+        data.left = new FormAttachment(0, 0);
+        data.right = new FormAttachment(openFileButton, 7);
+          
+        composite.setLayoutData(data);
+        composite.setLayout( new FillLayout() );
+        
+        final CompilationUnitEditor editor = new CompilationUnitEditor();
+        
+        IEditorSite site = (IEditorSite) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getSite();
+        
+        try {
+            editor.init(site, new MemoryEditorInput("MemFile", new ByteArrayInputStream(new byte[0])));
+        } catch (PartInitException e1) {
+            e1.printStackTrace();
+        }
+        editor.createPartControl(composite);
+        
+        staticSourceStyledText = editor.getViewer().getTextWidget();
+
+        staticSourceStyledText.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                JsonObject json = null;
+                try{
+                    json = normalGson.fromJson(staticSourceStyledText.getText(), JsonObject.class);   
+                }catch(Exception ex){}
+                
+                if(json != null){
+                    parentDataTree.removeAll();
+                    Helper.makeTreeItem( json, parentDataTree, null, true );
+                }
+            }
+        });
+       }
+       
+//     private void makeTreeFromJsonText( String text, Object object ) {
+//             
+//             JsonObject jsonObj = null;
+//             
+//             try{
+//                     jsonObj = normalGson.fromJson( text, JsonObject.class );
+//             }catch(Exception e){
+//                     MessageBox messageBox = new MessageBox(parentGroup.getShell(), SWT.ICON_ERROR);
+//                 messageBox.setMessage("Invalid JSON Text");
+//                 messageBox.open();
+//                     return;
+//             }
+//             Helper.makeTreeItem( jsonObj, parentDataTree, null, true );
+//     }
+       
+    @Override
+    public void setButtonsState( Map<String, Button> dataButtonMap ) {
+        dataButtonMap.get("addTreeItem").setEnabled(true);
+        dataButtonMap.get("upTreeItem").setEnabled(true);
+        dataButtonMap.get("downTreeItem").setEnabled(true);
+        dataButtonMap.get("removeTreeItem").setEnabled(true);
+        dataButtonMap.get("removeAllTreeItem").setEnabled(true);
+
+        Button conversionTreeAndText = dataButtonMap.get("conversionTreeAndText");
+        
+        if( conversionTreeAndText.getSelection() ){
+            conversionTreeAndText.setSelection(false);
+            Event e = new Event(); 
+            e.item = conversionTreeAndText; 
+            e.widget = conversionTreeAndText; 
+            e.type = SWT.Selection; 
+            conversionTreeAndText.notifyListeners(SWT.Selection, e);
+        }
+        
+        conversionTreeAndText.setVisible(false);
+    }
+
+    @Override
+    public void loadData(BindingData dataModel) {
+        JsonObject json = prettyGson.fromJson(dataModel.getJsonData(), JsonObject.class );
+        
+        if( dataModel.getJsonData() != null )
+            staticSourceStyledText.setText( prettyGson.toJson(json) );
+        
+        jsonFile = dataModel.getStaticFilePath();
+        
+        if( json != null )
+            Helper.makeTreeItem(json, parentDataTree, null, true);
+    }
+
+    public Composite getDataComposite() {
+        return dataComposite;
+    }
+}
index 97f1bf3..e72216d 100644 (file)
@@ -30,6 +30,7 @@ public class TreeItemData {
 
     private String objectType;
     private String objectValue;
+    private String source;
 
     /**
      * Gets a model.
@@ -103,4 +104,22 @@ public class TreeItemData {
         this.objectValue = objectValue;
     }
 
+    /**
+     * Gets a object source.
+     * 
+     * @return String source
+     */
+    public String getSource() {
+        return source;
+    }
+    
+    /**
+     * Sets a object source.
+     * 
+     * @param source
+     */
+    public void setSource(String source) {
+        this.source = source;
+    }
+
 }