/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.advisor.ui.views.guides;
import java.util.Properties;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.Section;
import org.teiid.designer.advisor.ui.AdvisorUiConstants;
import org.teiid.designer.advisor.ui.Messages;
import org.teiid.designer.advisor.ui.actions.AdvisorActionFactory;
import org.teiid.designer.advisor.ui.actions.AdvisorActionInfo;
import org.teiid.designer.advisor.ui.actions.AdvisorActionProvider;
import org.teiid.designer.advisor.ui.actions.AdvisorGuides;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.common.util.WidgetUtil;
import org.teiid.designer.ui.forms.FormUtil;
import org.teiid.designer.ui.viewsupport.DesignerPropertiesUtil;
import org.teiid.designer.ui.viewsupport.IPropertiesContext;
import org.teiid.designer.ui.viewsupport.ModelerUiViewUtils;
import org.teiid.designer.ui.viewsupport.PropertiesContextManager;
public class TeiidGuidesSection implements AdvisorUiConstants {
private FormToolkit toolkit;
private Section section;
private Composite sectionBody;
private Combo actionGroupCombo;
private TreeViewer guidesViewer;
private Hyperlink executeLink;
private Hyperlink goToExamplesLink;
private Text descriptionText;
private AdvisorActionProvider actionProvider;
private AdvisorGuides guides;
private final PropertiesContextManager propertiesManager = new PropertiesContextManager();
/**
* @param parent
* @param style
*/
public TeiidGuidesSection(FormToolkit toolkit, Composite parent) {
super();
this.toolkit = toolkit;
this.actionProvider = new AdvisorActionProvider();
this.guides = new AdvisorGuides();
createSection(parent);
}
@SuppressWarnings("unused")
private void createSection(Composite theParent) {
SECTION : {
section = this.toolkit.createSection(theParent, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED );
Color bkgdColor = this.toolkit.getColors().getBackground();
section.setText(Messages.ActionSets);
section.setTitleBarForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE));
GridData gd = new GridData(GridData.FILL, GridData.FILL, true, true); //GridData.FILL_HORIZONTAL); // | GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalSpan = 2;
section.setLayoutData(gd);
sectionBody = new Composite(section, SWT.NONE);
sectionBody.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
sectionBody.setBackground(bkgdColor);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 1;
layout.marginHeight = 1;
layout.marginWidth = 1;
sectionBody.setLayout(layout);
}
// Add go to examples link in section toolbar
EXAMPLES_LINK : {
Composite toolbar = FormUtil.createSectionToolBar(this.section, toolkit);
this.goToExamplesLink = this.toolkit.createHyperlink(toolbar, Messages.GoToExamples, SWT.WRAP);
this.toolkit.adapt(this.goToExamplesLink, true, true);
this.goToExamplesLink.setEnabled(false);
this.goToExamplesLink.setToolTipText(Messages.GoToExamples_Tooltip);
this.goToExamplesLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent theEvent) {
ModelerUiViewUtils.openTeiidDesignerExamplesPage();
}
});
this.goToExamplesLink.setBackground(this.section.getBackground());
this.goToExamplesLink.setEnabled(true);
}
EXECUTE_LINK : {
this.executeLink = this.toolkit.createHyperlink(sectionBody, Messages.ExecuteSelectedAction, SWT.WRAP);
this.toolkit.adapt(this.executeLink, true, true);
this.executeLink.setEnabled(false);
this.executeLink.setToolTipText(Messages.ExecuteSelectedAction_tooltip);
this.executeLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent theEvent) {
IStructuredSelection selection = (IStructuredSelection)guidesViewer.getSelection();
if( selection != null && !selection.isEmpty() && selection.getFirstElement() instanceof AdvisorActionInfo ) {
String actionId = ((AdvisorActionInfo)selection.getFirstElement()).getId();
launchGuidesAction(actionId);
}
}
});
this.executeLink.setBackground(this.section.getBackground());
}
ACTION_COMBO : {
actionGroupCombo = new Combo(sectionBody, SWT.NONE | SWT.READ_ONLY);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.CENTER;
gd.horizontalSpan = 2;
actionGroupCombo.setLayoutData(gd);
WidgetUtil.setComboItems(actionGroupCombo, this.guides.getCategories(), null, true);
actionGroupCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent ev ) {
selectComboItem(actionGroupCombo.getSelectionIndex());
}
});
}
GUIDES_VIEWER : {
guidesViewer = WidgetFactory.createTreeViewer(sectionBody, SWT.NONE | SWT.SINGLE );
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.heightHint = 180;
guidesViewer.getControl().setLayoutData(gd);
guidesViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
if( selection != null && !selection.isEmpty() && selection.getFirstElement() instanceof AdvisorActionInfo ) {
String actionId = ((AdvisorActionInfo)selection.getFirstElement()).getId();
launchGuidesAction(actionId);
}
}
});
guidesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
if( selection != null && !selection.isEmpty() && selection.getFirstElement() instanceof AdvisorActionInfo ) {
String desc = ((AdvisorActionInfo)selection.getFirstElement()).getDescription();
if( desc != null ) {
descriptionText.setText(desc);
} else {
descriptionText.setText(Messages.NoActionSelected);
}
executeLink.setEnabled(true);
} else {
descriptionText.setText(Messages.NoActionSelected);
executeLink.setEnabled(false);
}
}
});
guidesViewer.setLabelProvider(this.actionProvider);
guidesViewer.setContentProvider(this.actionProvider);
syncActionProvider(AdvisorGuides.MODEL_JDBC_SOURCE);
guidesViewer.setInput(guides.getChildren(AdvisorGuides.MODEL_JDBC_SOURCE));
guidesViewer.getTree().addMouseTrackListener(new MouseTrackAdapter() {
/**
* Sent when the mouse pointer hovers (that is, stops moving
* for an (operating system specified) period of time) over
* a control.
* The default behavior is to do nothing.
*
* @param e an event containing information about the hover
*/
@Override
public void mouseHover(MouseEvent e) {
guidesViewer.getTree().setToolTipText(Messages.DoubleClickToExecuteAction);
}
});
}
DESCRIPTION : {
// Add widgets to page
Group descriptionGroup = WidgetFactory.createGroup(sectionBody, "Description", GridData.FILL_HORIZONTAL, 3); //$NON-NLS-1$
descriptionText = new Text(descriptionGroup, SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL);
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
gd.heightHint = 60;
gd.widthHint = 200;
gd.horizontalSpan = 2;
descriptionText.setLayoutData(gd);
descriptionText.setBackground(sectionBody.getBackground());
descriptionText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE));
descriptionText.setText(Messages.NoActionSelected);
}
section.setClient(sectionBody);
this.executeLink.setEnabled(!guidesViewer.getSelection().isEmpty());
selectComboItem(getInitialComboSelectionIndex());
}
private void syncActionProvider(String id ) {
Properties properties = propertiesManager.getProperties(id);
this.actionProvider.setProperties(properties);
}
private void selectComboItem(int selectionIndex) {
if( selectionIndex >=0 ) {
actionGroupCombo.select(selectionIndex);
String categoryId = actionGroupCombo.getItem(selectionIndex);
syncActionProvider(categoryId);
this.guidesViewer.setInput(guides.getChildren(categoryId));
}
}
private int getInitialComboSelectionIndex() {
int index = 0;
for( String item : actionGroupCombo.getItems()) {
if( AdvisorGuides.MODEL_JDBC_SOURCE.equalsIgnoreCase(item)) {
return index;
}
index++;
}
return -1;
}
private void launchGuidesAction(String actionId) {
String guideId = actionGroupCombo.getText();
Properties properties = propertiesManager.getProperties(guideId);
if( properties != null && !properties.isEmpty()) {
cleanProperties(properties);
}
syncActionProvider(guideId);
AdvisorActionFactory.executeAction(actionId, properties, true);
syncActionProvider(guideId);
this.guidesViewer.refresh();
}
private void cleanProperties(Properties properties) {
// check project properties and re-set if project closed or no open projects
boolean openModelProjects = !ModelerUiViewUtils.getOpenModelProjects().isEmpty();
// if open model projects....
if( openModelProjects ) {
// check for existing project name
String projName = DesignerPropertiesUtil.getProjectName(properties);
if( projName != null ) {
// check if project exists
IProject proj = DesignerPropertiesUtil.getProject(properties);
if( proj != null && !proj.isOpen() ) {
// project is not open, so set to null
DesignerPropertiesUtil.setProjectName(properties, null);
}
}
DesignerPropertiesUtil.setProjectStatus(properties, IPropertiesContext.OPEN_PROJECTS_EXIST);
} else {
DesignerPropertiesUtil.setProjectName(properties, null);
DesignerPropertiesUtil.setProjectStatus(properties, IPropertiesContext.NO_OPEN_PROJECT);
}
}
}