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 {
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)) {
--- /dev/null
+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);
+ }
+}
--- /dev/null
+/*
+ * 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;
+// }
+}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+ }
+}
--- /dev/null
+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);
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
private String objectType;
private String objectValue;
+ private String source;
/**
* Gets a model.
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;
+ }
+
}