/*******************************************************************************
* Copyright (c) 2013, 2014 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat Inc. - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.thym.ui.config.internal;
import java.util.Arrays;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.thym.core.config.Icon;
import org.eclipse.thym.core.config.Splash;
import org.eclipse.thym.core.config.Widget;
import org.eclipse.thym.core.config.WidgetModel;
import org.eclipse.thym.ui.HybridUI;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class IconsPage extends FormPage {
private DataBindingContext m_bindingContext;
private FormToolkit formToolkit;
private Table iconsTable;
private Table splashTable;
private Text txtWidth;
private Text txtHeight;
private Text txtPlatform;
private Text txtDensity;
private TableViewer iconsTableViewer;
private TableViewer splashTableViewer;
private Text txtSplshWidth;
private Text txtSplshHeight;
private Text txtSplshPlatform;
private Text txtSplshDensity;
public IconsPage(FormEditor editor) {
super(editor, "icons", "Icons && Splash Screen");
formToolkit = editor.getToolkit();
}
@Override
protected void createFormContent(IManagedForm managedForm) {
final ScrolledForm form = managedForm.getForm();
formToolkit.decorateFormHeading( form.getForm());
managedForm.getForm().setText(getTitle());
{
TableWrapLayout tableWrapLayout = new TableWrapLayout();
tableWrapLayout.makeColumnsEqualWidth = true;
tableWrapLayout.numColumns = 1;
managedForm.getForm().getBody().setLayout(tableWrapLayout);
}
Section sctnIcons = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR);
TableWrapData twd_sctnIcons = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1);
twd_sctnIcons.grabHorizontal = true;
sctnIcons.setLayoutData(twd_sctnIcons);
managedForm.getToolkit().paintBordersFor(sctnIcons);
sctnIcons.setText("Icons");
Composite composite = managedForm.getToolkit().createComposite(sctnIcons, SWT.NONE);
managedForm.getToolkit().paintBordersFor(composite);
sctnIcons.setClient(composite);
composite.setLayout(new GridLayout(3, false));
iconsTableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION);
iconsTable = iconsTableViewer.getTable();
iconsTable.setHeaderVisible(true);
GridData gd_iconsTable = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
gd_iconsTable.heightHint = 125;
iconsTable.setLayoutData(gd_iconsTable);
managedForm.getToolkit().paintBordersFor(iconsTable);
Composite composite_3 = managedForm.getToolkit().createComposite(composite, SWT.NONE);
composite_3.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1));
managedForm.getToolkit().paintBordersFor(composite_3);
composite_3.setLayout(new FillLayout(SWT.VERTICAL));
Button btnIconAdd = managedForm.getToolkit().createButton(composite_3, "Add...", SWT.NONE);
btnIconAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String src = getImageSrc();
ConfigEditor editor = (ConfigEditor) getEditor();
Icon icon = editor.getWidgetModel().createIcon(getWidget());
icon.setSrc(src);
getWidget().addIcon(icon);
}
});
Button btnIconRemove = managedForm.getToolkit().createButton(composite_3, "Remove", SWT.NONE);
Group iconDetailGrp = new Group(composite, SWT.NONE);
iconDetailGrp.setText("Icon Image Details");
iconDetailGrp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
managedForm.getToolkit().adapt(iconDetailGrp);
managedForm.getToolkit().paintBordersFor(iconDetailGrp);
iconDetailGrp.setLayout(new GridLayout(1, false));
Composite imageDetailComposite = managedForm.getToolkit().createComposite(iconDetailGrp, SWT.NONE);
managedForm.getToolkit().paintBordersFor(imageDetailComposite);
imageDetailComposite.setLayout(new GridLayout(2, false));
Label lblWidth = managedForm.getToolkit().createLabel(imageDetailComposite, "Width:", SWT.NONE);
txtWidth = managedForm.getToolkit().createText(imageDetailComposite, "New Text", SWT.NONE);
txtWidth.setText("");
txtWidth.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
Label lblHeight = managedForm.getToolkit().createLabel(imageDetailComposite, "Height:", SWT.NONE);
txtHeight = managedForm.getToolkit().createText(imageDetailComposite, "New Text", SWT.NONE);
txtHeight.setText("");
txtHeight.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblPlatform = managedForm.getToolkit().createLabel(imageDetailComposite, "Platform:", SWT.NONE);
txtPlatform = managedForm.getToolkit().createText(imageDetailComposite, "New Text", SWT.NONE);
txtPlatform.setText("");
txtPlatform.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblDensity = managedForm.getToolkit().createLabel(imageDetailComposite, "Density:", SWT.NONE);
txtDensity = managedForm.getToolkit().createText(imageDetailComposite, "New Text", SWT.NONE);
txtDensity.setText("");
txtDensity.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
btnIconRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection)iconsTableViewer.getSelection();
if(selection.isEmpty())
return;
Icon icon = (Icon)selection.getFirstElement();
getWidget().removeIcon(icon);
}
});
Section sctnSplashes = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR);
sctnSplashes.setLayoutData(new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 1));
managedForm.getToolkit().paintBordersFor(sctnSplashes);
sctnSplashes.setText("Splash Screens");
Composite composite_1 = managedForm.getToolkit().createComposite(sctnSplashes, SWT.NONE);
managedForm.getToolkit().paintBordersFor(composite_1);
sctnSplashes.setClient(composite_1);
composite_1.setLayout(new GridLayout(3, false));
splashTableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION);
splashTable = splashTableViewer.getTable();
splashTable.setHeaderVisible(true);
GridData gd_splashTable = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
gd_splashTable.heightHint = 125;
splashTable.setLayoutData(gd_splashTable);
managedForm.getToolkit().paintBordersFor(splashTable);
Composite composite_4 = managedForm.getToolkit().createComposite(composite_1, SWT.NONE);
composite_4.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1));
managedForm.getToolkit().paintBordersFor(composite_4);
composite_4.setLayout(new FillLayout(SWT.VERTICAL));
Button btnSplashAdd = managedForm.getToolkit().createButton(composite_4, "Add...", SWT.NONE);
btnSplashAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String src = getImageSrc();
Splash splash = ((ConfigEditor) getEditor()).getWidgetModel().createSplash(getWidget());
splash.setSrc(src);
getWidget().addSplash(splash);
}
});
Button btnSplashRemove = managedForm.getToolkit().createButton(composite_4, "Remove", SWT.NONE);
Group splashDetailGrp = new Group(composite_1, SWT.NONE);
splashDetailGrp.setText("Splash Image Details");
managedForm.getToolkit().adapt(splashDetailGrp);
managedForm.getToolkit().paintBordersFor(splashDetailGrp);
splashDetailGrp.setLayout(new GridLayout(1, false));
Composite splashDetailComposite = managedForm.getToolkit().createComposite(splashDetailGrp, SWT.NONE);
managedForm.getToolkit().paintBordersFor(splashDetailComposite);
splashDetailComposite.setLayout(new GridLayout(2, false));
Label lblSplshWidth = managedForm.getToolkit().createLabel(splashDetailComposite, "Width:", SWT.NONE);
txtSplshWidth = managedForm.getToolkit().createText(splashDetailComposite, "New Text", SWT.NONE);
txtSplshWidth.setText("");
txtSplshWidth.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
Label lblSplshHeight = managedForm.getToolkit().createLabel(splashDetailComposite, "Height:", SWT.NONE);
txtSplshHeight = managedForm.getToolkit().createText(splashDetailComposite, "New Text", SWT.NONE);
txtSplshHeight.setText("");
txtSplshHeight.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblSplshPlatform = managedForm.getToolkit().createLabel(splashDetailComposite, "Platform:", SWT.NONE);
txtSplshPlatform = managedForm.getToolkit().createText(splashDetailComposite, "New Text", SWT.NONE);
txtSplshPlatform.setText("");
txtSplshPlatform.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblSplshDensity = managedForm.getToolkit().createLabel(splashDetailComposite, "Density:", SWT.NONE);
txtSplshDensity = managedForm.getToolkit().createText(splashDetailComposite, "New Text", SWT.NONE);
txtSplshDensity.setText("");
txtSplshDensity.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
btnSplashRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection)splashTableViewer.getSelection();
if(selection.isEmpty())
return;
Splash splash = (Splash)selection.getFirstElement();
getWidget().removeSplash(splash);
}
});
m_bindingContext = initDataBindings();
}
private String getImageSrc(){
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getSite().getShell(),
new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
dialog.setTitle("Choose image");
IProject currentProject = getProject();
dialog.setInput(currentProject.getFolder("www"));
dialog.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
IResource resource = (IResource) element;
return resource.getType() == IResource.FOLDER ||
Arrays.binarySearch(WidgetModel.ICON_EXTENSIONS,
resource.getFileExtension()) >= 0 ;
}
});
dialog.setValidator(new ISelectionStatusValidator() {
@Override
public IStatus validate(Object[] selection) {
if (selection.length == 0 || selection.length > 1) {
return new Status(IStatus.ERROR,
HybridUI.PLUGIN_ID, "Must have selection");
}
IResource resource = (IResource) selection[0];
if (resource.getType() == IResource.FOLDER) {
return new Status(IStatus.ERROR,
HybridUI.PLUGIN_ID, "Can not select folder");
}
return Status.OK_STATUS;
}
});
if(dialog.open() == Window.OK){
IResource resource = (IResource) dialog.getFirstResult();
String src = resource.getProjectRelativePath().toString()
.substring("www".length() + 1);
return src;
}
return null;
}
private IProject getProject() {
IEditorPart editorPart = HybridUI.getDefault().getWorkbench()
.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if (editorPart.getEditorInput() instanceof IFileEditorInput) {
IFileEditorInput input = (IFileEditorInput) editorPart
.getEditorInput();
IProject activeProject = input.getFile().getProject();
return activeProject;
} else {
return null;
}
}
private Widget getWidget(){
return ((ConfigEditor)getEditor()).getWidget();
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
IObservableMap observeMap = BeansObservables.observeMap(listContentProvider.getKnownElements(), Icon.class, "src");
iconsTableViewer.setLabelProvider(new ObservableMapLabelProvider(observeMap));
iconsTableViewer.setContentProvider(listContentProvider);
//
IObservableList iconsGetWidgetObserveList = BeanProperties.list("icons").observe(getWidget());
iconsTableViewer.setInput(iconsGetWidgetObserveList);
//
ObservableListContentProvider listContentProvider_1 = new ObservableListContentProvider();
IObservableMap observeMap_1 = BeansObservables.observeMap(listContentProvider_1.getKnownElements(), Splash.class, "src");
splashTableViewer.setLabelProvider(new ObservableMapLabelProvider(observeMap_1));
splashTableViewer.setContentProvider(listContentProvider_1);
//
IObservableList splashesGetWidgetObserveList = BeanProperties.list("splashes").observe(getWidget());
splashTableViewer.setInput(splashesGetWidgetObserveList);
//
IObservableValue observeSingleSelectionIconsTableViewer = ViewerProperties.singleSelection().observe(iconsTableViewer);
IObservableValue iconsTableViewerWidthObserveDetailValue = BeanProperties.value(Icon.class, "width", int.class).observeDetail(observeSingleSelectionIconsTableViewer);
IObservableValue observeTextTxtWidthObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtWidth);
bindingContext.bindValue(iconsTableViewerWidthObserveDetailValue, observeTextTxtWidthObserveWidget, null, null);
//
IObservableValue observeSingleSelectionIconsTableViewer_1 = ViewerProperties.singleSelection().observe(iconsTableViewer);
IObservableValue iconsTableViewerHeightObserveDetailValue = BeanProperties.value(Icon.class, "height", int.class).observeDetail(observeSingleSelectionIconsTableViewer_1);
IObservableValue observeTextTxtHeightObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtHeight);
bindingContext.bindValue(iconsTableViewerHeightObserveDetailValue, observeTextTxtHeightObserveWidget, null, null);
//
IObservableValue observeSingleSelectionIconsTableViewer_2 = ViewerProperties.singleSelection().observe(iconsTableViewer);
IObservableValue iconsTableViewerPlatformObserveDetailValue = BeanProperties.value(Icon.class, "platform", String.class).observeDetail(observeSingleSelectionIconsTableViewer_2);
IObservableValue observeTextTxtPlatformObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtPlatform);
bindingContext.bindValue(iconsTableViewerPlatformObserveDetailValue, observeTextTxtPlatformObserveWidget, null, null);
//
IObservableValue observeSingleSelectionIconsTableViewer_3 = ViewerProperties.singleSelection().observe(iconsTableViewer);
IObservableValue iconsTableViewerDensityObserveDetailValue = BeanProperties.value(Icon.class, "density", String.class).observeDetail(observeSingleSelectionIconsTableViewer_3);
IObservableValue observeTextTxtDensityObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtDensity);
bindingContext.bindValue(iconsTableViewerDensityObserveDetailValue, observeTextTxtDensityObserveWidget, null, null);
//
IObservableValue observeSingleSelectionSplashTableViewer = ViewerProperties.singleSelection().observe(splashTableViewer);
IObservableValue splashTableViewerWidthObserveDetailValue = BeanProperties.value(Splash.class, "width", int.class).observeDetail(observeSingleSelectionSplashTableViewer);
IObservableValue observeTextTxtSplshWidthObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtSplshWidth);
bindingContext.bindValue(splashTableViewerWidthObserveDetailValue, observeTextTxtSplshWidthObserveWidget, null, null);
//
IObservableValue observeSingleSelectionSplashTableViewer_1 = ViewerProperties.singleSelection().observe(splashTableViewer);
IObservableValue splashTableViewerHeightObserveDetailValue = BeanProperties.value(Splash.class, "height", int.class).observeDetail(observeSingleSelectionSplashTableViewer_1);
IObservableValue observeTextTxtSplshHeightObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtSplshHeight);
bindingContext.bindValue(splashTableViewerHeightObserveDetailValue, observeTextTxtSplshHeightObserveWidget, null, null);
//
IObservableValue observeSingleSelectionSplashTableViewer_2 = ViewerProperties.singleSelection().observe(splashTableViewer);
IObservableValue splashTableViewerPlatformObserveDetailValue = BeanProperties.value(Splash.class, "platform", String.class).observeDetail(observeSingleSelectionSplashTableViewer_2);
IObservableValue observeTextTxtSplshPlatformObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtSplshPlatform);
bindingContext.bindValue(splashTableViewerPlatformObserveDetailValue, observeTextTxtSplshPlatformObserveWidget, null, null);
//
IObservableValue observeSingleSelectionSplashTableViewer_3 = ViewerProperties.singleSelection().observe(splashTableViewer);
IObservableValue splashTableViewerDensityObserveDetailValue = BeanProperties.value(Splash.class, "density", String.class).observeDetail(observeSingleSelectionSplashTableViewer_3);
IObservableValue observeTextTxtSplshDensityObserveWidget = WidgetProperties.text(SWT.Modify).observe(txtSplshDensity);
bindingContext.bindValue(splashTableViewerDensityObserveDetailValue, observeTextTxtSplshDensityObserveWidget, null, null);
//
return bindingContext;
}
}