// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.editors;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Observable;
import java.util.Observer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.List;
import org.eclipse.ui.forms.AbstractFormPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
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 com.amalto.workbench.utils.IConstants;
import com.amalto.workbench.utils.Util;
import com.amalto.workbench.utils.XtentisException;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.widgets.ComplexTableViewerColumn;
import com.amalto.workbench.widgets.TableViewWrapper;
import com.amalto.workbench.widgets.TisTableViewer;
import com.amalto.workbench.widgets.WidgetFactory;
public abstract class AMainPageV2 extends AFormPage implements ModifyListener, Observer {
private static Log log = LogFactory.getLog(AMainPageV2.class);
protected boolean comitting;
protected boolean refreshing;
protected boolean isCompositeView = true;
private TMDMService port;
public void setCompositeView(boolean isCompositeView) {
this.isCompositeView = isCompositeView;
}
protected ComplexTableViewerColumn[] conditionsColumns;
protected TableViewWrapper wrap = new TableViewWrapper();;
protected TisTableViewer conditionViewer;
public boolean isComitting() {
return comitting;
}
public void setComitting(boolean comitting) {
this.comitting = comitting;
}
public boolean isRefreshing() {
return refreshing;
}
public void setRefreshing(boolean refreshing) {
this.refreshing = refreshing;
}
private TopFormPart topFormPart = null;
public AMainPageV2(FormEditor editor, String id, String title) {
super(editor, id, title);
}
public void update(Observable o, Object arg) {
}
@Override
protected void createFormContent(IManagedForm managedForm) {
super.createFormContent(managedForm);
try {
/*
* FormToolkit toolkit = managedForm.getToolkit();
*
* final ScrolledForm form = managedForm.getForm(); TableWrapLayout formLayout = new TableWrapLayout();
* form.getBody().setLayout(formLayout);
*
* formLayout.numColumns = 1;
*
* //create the FormPart firstSectionPart = new SectionPart( form.getBody(), toolkit,
* Section.DESCRIPTION|ExpandableComposite.TWISTIE|ExpandableComposite.EXPANDED ) ;
* managedForm.addPart(firstSectionPart);
*
* //Layout the components Section firstSection = firstSectionPart.getSection();
* firstSection.setText("Characteristics"); firstSection.setLayoutData( new
* TableWrapData(TableWrapData.FILL_GRAB) );
*
* firstSection.addExpansionListener(new ExpansionAdapter() { public void
* expansionStateChanged(ExpansionEvent e) { form.reflow(true); } });
* firstSection.setDescription("The main characteristics"); firstSection.setLayout(new GridLayout(1,false));
*
* toolkit.createCompositeSeparator(firstSection);
*
*
* Composite charComposite = toolkit.createComposite(firstSection); charComposite.setLayoutData( new
* GridData(SWT.FILL,SWT.FILL,true,true,1,1) ); GridLayout charLayout = new GridLayout(2,false);
* charComposite.setLayout(charLayout);
*
* firstSection.setClient(charComposite);
*/
ScrolledForm form = managedForm.getForm();
TableWrapLayout formLayout = new TableWrapLayout();
form.getBody().setLayout(formLayout);
// sets the title
form.setText(this.getTitle());
// get the toolkit
FormToolkit toolkit = WidgetFactory.getWidgetFactory();// managedForm.getToolkit();
// This part is meant to track dirty states
topFormPart = new TopFormPart();
getManagedForm().addPart(topFormPart);
// initCoditionsColumns();
createCharacteristicsContent(toolkit, topFormPart.getComposite());
// adapt body add mouse/focus listener for child
// WidgetFactory factory=WidgetFactory.getWidgetFactory();
toolkit.adapt(form.getBody());
initReadOnly(form);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}// createFormContent
protected void initCoditionsColumns() {
ComplexTableViewerColumn operatorColumn;
if (isCompositeView) {
operatorColumn = new ComplexTableViewerColumn("Operator", false, "", "", "", ComplexTableViewerColumn.COMBO_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
IConstants.COMPOSITE_VIEW_CONDITION_OPERATORS, 0);
} else {
operatorColumn = new ComplexTableViewerColumn("Operator", false, "", "", "", ComplexTableViewerColumn.COMBO_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
IConstants.VIEW_CONDITION_OPERATORS, 0);
}
conditionsColumns = new ComplexTableViewerColumn[] {
new ComplexTableViewerColumn("XPath", false, "newXPath", "newXPath", "", ComplexTableViewerColumn.XPATH_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
new String[] {}, 0),
operatorColumn,
new ComplexTableViewerColumn("Value", false, "", "", "", ComplexTableViewerColumn.XPATH_STYLE, new String[] {}, 0),//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
new ComplexTableViewerColumn("Predicate", true, "", "", "", ComplexTableViewerColumn.COMBO_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
IConstants.PREDICATES, 0), };
}
/**
* The composite containing the actual characteristics form By default its layout is GridLayout of 2 columns
*
* @param charSection
*/
protected abstract void createCharacteristicsContent(FormToolkit toolkit, Composite charSection);
protected Composite getNewSectionComposite(String title) {
return getNewSectionComposite(title, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE
| ExpandableComposite.EXPANDED);
}
protected Composite getNewSectionComposite(String title, int style) {
return (Composite) getNewSection(title, style).getClient();
}
protected Section getNewSection(String title) {
return getNewSection(title, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
}
protected Section getNewSection(String title, int style) {
// create the FormPart
SectionPart newSectionPart = new SectionPart(this.getManagedForm().getForm().getBody(), this.getManagedForm()
.getToolkit(), style);
this.getManagedForm().addPart(newSectionPart);
// Layout the components
Section newSection = newSectionPart.getSection();
if (title != null) {
newSection.setText(title);
}
newSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
newSection.addExpansionListener(new ExpansionAdapter() {
@Override
public void expansionStateChanged(ExpansionEvent e) {
AMainPageV2.this.getManagedForm().getForm().reflow(true);
}
});
newSection.setLayout(new GridLayout(1, false));
// this.getManagedForm().getToolkit().createCompositeSeparator(newSection);
newSection.setClient(getNewSectionComposite(newSection)); // in case someone calls getClient directly
return newSection;
}
public Composite getNewSectionComposite(Section section) {
Composite newComposite = this.getManagedForm().getToolkit().createComposite(section);
newComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
GridLayout charLayout = new GridLayout(2, false);
newComposite.setLayout(charLayout);
return newComposite;
}
/**
* Modify Events on the page
*/
public void modifyText(ModifyEvent e) {
markDirtyWithoutCommit();
}
/**
* Marks the page as dirty
*/
public void markDirty() {
topFormPart.markDirty();
// TODO:check this method if there is any other problem.
commitChanges();
}
public void markDirtyWithoutCommit() {
topFormPart.markDirty();
}
// This Part is meant to track dirty states changes
class TopFormPart extends AbstractFormPart {
public Composite getComposite() {
ScrolledForm form = this.getManagedForm().getForm();
Composite topComposite = this.getManagedForm().getToolkit().createComposite(form.getBody());
topComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
topComposite.setLayout(new GridLayout(2, false));
return topComposite;
}
}
/****************************************************************************
* DND
****************************************************************************/
protected class DCDragSourceListener implements DragSourceListener {
private int selected;
public void dragFinished(DragSourceEvent event) {
Control control = ((DragSource) event.widget).getControl();
if ((control instanceof List) && ((event.detail & DND.DROP_MOVE) == DND.DROP_MOVE)) {
((List) control).remove(selected);
markDirty();
}
}
public void dragSetData(DragSourceEvent event) {
Control control = ((DragSource) event.widget).getControl();
if ((control instanceof List)) {
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
this.selected = ((List) control).getSelectionIndex();
event.data = ((List) control).getSelection()[0];
}
}
}
public void dragStart(DragSourceEvent event) {
Control control = ((DragSource) event.widget).getControl();
if ((control instanceof List)) {
event.doit = (((List) control).getItemCount() > 0);
}
}
}
public class DCDropTargetListener implements DropTargetListener {
public void dragEnter(DropTargetEvent event) {
// priority to copy
if ((event.operations & DND.DROP_COPY) == DND.DROP_COPY) {
event.detail = DND.DROP_COPY;
} else if ((event.operations & DND.DROP_MOVE) == DND.DROP_MOVE) {
event.detail = DND.DROP_MOVE;
} else {
event.detail = DND.DROP_NONE;
}
}
public void dragLeave(DropTargetEvent event) {
}
public void dragOperationChanged(DropTargetEvent event) {
}
public void dragOver(DropTargetEvent event) {
}
public void drop(DropTargetEvent event) {
Control control = ((DropTarget) event.widget).getControl();
if ((control instanceof List) && ((event.operations & DND.DROP_COPY) == DND.DROP_COPY)) {
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
if (!Arrays.asList(((List) control).getItems()).contains(event.data)) {
((List) control).add((String) event.data);
markDirty();
}
}
}
}
public void dropAccept(DropTargetEvent event) {
}
}
protected TMDMService getService() {
if (port == null) {
try {
port = Util.getMDMService(getXObject());
} catch (XtentisException e) {
log.error(e.getMessage(), e);
}
}
return port;
}
protected java.util.List<String> getRegex() {
java.util.List<String> regex = new ArrayList<String>();
regex.add(".*"); //$NON-NLS-1$
return regex;
}
}