// ============================================================================
//
// Copyright (C) 2006-2012 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 org.talend.repository.preference;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ISelection;
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.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.image.EImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.ui.swt.advanced.composite.ThreeCompositesSashForm;
import org.talend.core.CorePlugin;
import org.talend.core.model.components.ComponentUtilities;
import org.talend.core.model.components.IComponentsFactory;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.ComponentSetting;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.designer.components.preference.labelformat.TalendPaletteLabelProvider;
import org.talend.designer.components.preference.labelformat.TalendPaletteTreeProvider;
import org.talend.repository.ProjectManager;
import org.talend.repository.i18n.Messages;
import org.talend.repository.model.ComponentsFactoryProvider;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.ui.actions.ShowStandardAction;
/**
* DOC aimingchen class global comment. Detailled comment
*/
public class PaletteSettingPage extends ProjectSettingPage {
private static final String FAMILY_SPEARATOR = "--FAMILY--"; //$NON-NLS-1$
// private static final String DIALOG_TITLE = "Palette Settings";
private static final boolean RESTORE = true;
private TreeViewer hiddenViewer, displayViewer;
private Project project = pro;
private Button hideCompnentsButton;
private Button displayComponentsButton;
private ThreeCompositesSashForm compositesSachForm;
private boolean needCodeGen;
// <name:visiblility>
private Map<String, Boolean> statusBackup = new HashMap<String, Boolean>();
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
init();
Composite composite = new Composite(parent, 0);
compositesSachForm = new ThreeCompositesSashForm(composite, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginBottom = 0;
gridLayout.marginHeight = 0;
gridLayout.marginLeft = 0;
gridLayout.marginRight = 0;
gridLayout.marginTop = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = 0;
composite.setLayout(gridLayout);
GridData gridData = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(gridData);
addTreeViewer(compositesSachForm);
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
if (factory.isUserReadOnlyOnCurrentProject()) {
compositesSachForm.setEnabled(false);
}
return composite;
}
private void init() {
// this.project = pro;
List<ComponentSetting> c = getComponentsFromProject(project);
for (ComponentSetting componentSetting : c) {
statusBackup.put(componentSetting.getFamily() + FAMILY_SPEARATOR + componentSetting.getName(),
!componentSetting.isHidden());
}
}
private PaletteRoot getViewerInput() {
return ComponentUtilities.createPaletteRootWithAllComponents();
// PaletteRoot paletteRoot = CorePlugin.getDefault().getDesignerCoreService().getAllNodeStructure(components);
// return paletteRoot;
}
/**
* qwei Comment method "addViewer".
*
* @param parent
*/
private void addTreeViewer(ThreeCompositesSashForm parent) {
Composite leftComposite = parent.getLeftComposite();
Label label = new Label(leftComposite, SWT.NONE);
label.setText("Hide");
hiddenViewer = new TreeViewer(leftComposite);
hiddenViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
hiddenViewer.setContentProvider(new TalendPaletteTreeProvider());
hiddenViewer.setLabelProvider(new TalendPaletteLabelProvider());
hiddenViewer.addFilter(getFilterForComponent(false));
hiddenViewer.expandToLevel(2);
hiddenViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
displayComponentsButton.setEnabled(!event.getSelection().isEmpty());
}
});
createButtons(parent.getMidComposite());
Composite rightComposite = parent.getRightComposite();
label = new Label(rightComposite, SWT.NONE);
label.setText("Show");
displayViewer = new TreeViewer(rightComposite);
displayViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
displayViewer.setContentProvider(new TalendPaletteTreeProvider());
displayViewer.setLabelProvider(new TalendPaletteLabelProvider());
displayViewer.addFilter(getFilterForComponent(true));
displayViewer.expandToLevel(2);
displayViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
hideCompnentsButton.setEnabled(!event.getSelection().isEmpty());
}
});
PaletteRoot input = getViewerInput();
getComponentsFromProject(project);
hiddenViewer.setInput(input);
displayViewer.setInput(input);
}
/**
* DOC qwei Comment method "getFilterForHiddenComponent". isVisible false for left viewer; true for right viewer
*
* @return
*/
private ViewerFilter getFilterForComponent(final boolean isVisible) {
ViewerFilter filter = new ViewerFilter() {
public boolean select(Viewer viewer, Object parentElement, Object element) {
PaletteEntry entry = (PaletteEntry) element;
if (entry instanceof PaletteContainer) {
return isFolderVisible((PaletteContainer) entry, isVisible);
}
if (isVisible) {
return isComponentVisible(entry);
} else {
return !isComponentVisible(entry);
}
}
};
return filter;
}
/**
* Check if this folder needs to be showed. *
*
* @param entry
* @param isVisible
* @return
*/
protected boolean isFolderVisible(PaletteContainer container, boolean isVisible) {
for (Iterator iterator = container.getChildren().iterator(); iterator.hasNext();) {
PaletteEntry entry = (PaletteEntry) iterator.next();
if (entry instanceof PaletteContainer) {
boolean display = isFolderVisible((PaletteContainer) entry, isVisible);
if (display) {
return true;
} else {
continue;
}
} else {
if (isVisible) {
if (isComponentVisible(entry)) {
return true;
}
} else {
if (!isComponentVisible(entry)) {
return true;
}
}
continue;
}
}
return false;
}
private void refreshViewer() {
hiddenViewer.refresh();
displayViewer.refresh();
}
private void createButtons(Composite parent) {
Label label1 = new Label(compositesSachForm.getMidComposite(), SWT.NONE);
GridDataFactory.swtDefaults().hint(42, 18).applyTo(label1);
Composite buttonComposite = new Composite(compositesSachForm.getMidComposite(), SWT.BORDER);
Label label2 = new Label(compositesSachForm.getMidComposite(), SWT.NONE);
GridDataFactory.swtDefaults().hint(42, 0).applyTo(label2);
GridLayout gridLayout = new GridLayout(1, true);
buttonComposite.setLayout(gridLayout);
GridData gridData = new GridData(GridData.FILL_BOTH);
// gridData.verticalAlignment = GridData.CENTER;
buttonComposite.setLayoutData(gridData);
Composite buttonComposite2 = new Composite(buttonComposite, SWT.NONE);
gridLayout = new GridLayout(1, true);
gridLayout.marginBottom = 0;
gridLayout.marginHeight = 0;
gridLayout.marginLeft = 0;
gridLayout.marginRight = 0;
gridLayout.marginTop = 0;
gridLayout.marginWidth = 0;
buttonComposite2.setLayout(gridLayout);
gridData = new GridData(GridData.FILL_BOTH);
gridData.verticalAlignment = GridData.CENTER;
buttonComposite2.setLayoutData(gridData);
displayComponentsButton = new Button(buttonComposite2, SWT.NONE);
displayComponentsButton.setImage(ImageProvider.getImage(EImage.RIGHT_ICON));
displayComponentsButton.setToolTipText(""); //$NON-NLS-1$
GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(displayComponentsButton);
displayComponentsButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
setComponentVisible(hiddenViewer.getSelection(), true);
// getButton(IDialogConstants.OK_ID).setEnabled(true);
setValid(true);
needCodeGen = true;
}
});
hideCompnentsButton = new Button(buttonComposite2, SWT.NONE);
hideCompnentsButton.setImage(ImageProvider.getImage(EImage.LEFT_ICON));
hideCompnentsButton.setToolTipText(""); //$NON-NLS-1$
gridData = new GridData();
gridData.verticalAlignment = GridData.CENTER;
hideCompnentsButton.setLayoutData(gridData);
hideCompnentsButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
setComponentVisible(displayViewer.getSelection(), false);
// getButton(IDialogConstants.OK_ID).setEnabled(true);
setValid(true);
}
});
displayComponentsButton.setEnabled(false);
hideCompnentsButton.setEnabled(false);
}
/**
* set the selected component as visible or not
*
* @param selection
* @param b
*/
protected void setComponentVisible(ISelection selection, boolean visible) {
IStructuredSelection sel = (IStructuredSelection) selection;
Set<String> names = new HashSet<String>();
for (Iterator iterator = sel.iterator(); iterator.hasNext();) {
PaletteEntry entry = (PaletteEntry) iterator.next();
retreiveAllEntry(names, entry);
}
Set<String> usedComponents = ComponentUtilities.getComponentsUsedInProject(ProjectManager.getInstance()
.getCurrentProject());
boolean isUsed = false;
for (String string : names) {
if (!visible) {
if (usedComponents.contains(string)) {
isUsed = true;
continue;
}
}
setComponentVisible(string, visible, !RESTORE);
}
if (isUsed) {
MessageDialog messageDialog = new MessageDialog(getShell(),
Messages.getString("PaletteSettingPage.paletteSettings"), null, //$NON-NLS-1$
Messages.getString("PaletteSettingPage.selection1") + "\n" //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.getString("PaletteSettingPage.selection2"), MessageDialog.INFORMATION, //$NON-NLS-1$
new String[] { "OK" }, 0); //$NON-NLS-1$
messageDialog.open();
}
refreshViewer();
}
private void retreiveAllEntry(Set<String> list, PaletteEntry entry) {
if (entry instanceof PaletteContainer) {
PaletteContainer container = (PaletteContainer) entry;
for (Iterator iterator = container.getChildren().iterator(); iterator.hasNext();) {
PaletteEntry en = (PaletteEntry) iterator.next();
retreiveAllEntry(list, en);
}
} else {
String family = ComponentsFactoryProvider.getPaletteEntryFamily(entry.getParent()); //$NON-NLS-1$ //$NON-NLS-2$
list.add(family + FAMILY_SPEARATOR + entry.getLabel());
}
}
@SuppressWarnings("unchecked")
public List<ComponentSetting> getComponentsFromProject(Project project) {
List<ComponentSetting> components = (List<ComponentSetting>) project.getEmfProject().getComponentsSettings();
return components;
}
public boolean isComponentVisible(PaletteEntry entry) {
String label = entry.getLabel();
String family = ComponentsFactoryProvider.getPaletteEntryFamily(entry.getParent());
List<ComponentSetting> components = getComponentsFromProject(project);
for (ComponentSetting componentSetting : components) {
if (componentSetting.getName().equals(label) && componentSetting.getFamily() != null
&& componentSetting.getFamily().equals(family)) {
return !componentSetting.isHidden();
}
}
return true;
}
private void setComponentVisibleForRestore(String name, boolean visible) {
setComponentVisible(name, visible, RESTORE);
}
private void setComponentVisible(String name, boolean visible, boolean restore) {
try {
String[] names = name.split(FAMILY_SPEARATOR);
if (names.length != 2) {
return;
}
String family = names[0];
String label = names[1];
List<ComponentSetting> components = getComponentsFromProject(project);
for (ComponentSetting componentSetting : components) {
if (componentSetting.getFamily() != null && componentSetting.getFamily().equals(family)
&& componentSetting.getName().equals(label)) {
componentSetting.setHidden(!visible);
return;
}
}
if (!restore) {
ComponentSetting cs = PropertiesFactory.eINSTANCE.createComponentSetting();
cs.setName(label);
cs.setHidden(!visible);
cs.setFamily(family);
components.add(cs);
statusBackup.put(label, !visible);
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
/**
* qwei Comment method "getViewer".
*
* @return
*/
public TreeViewer getViewer() {
return this.hiddenViewer;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performApply()
*/
@Override
protected void performApply() {
// TODO Auto-generated method stub
// super.performApply();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk() {
// TODO Auto-generated method stub
boolean performOk = super.performOk();
okPressed();
return performOk;
}
protected void okPressed() {
IProxyRepositoryFactory prf = CorePlugin.getDefault().getProxyRepositoryFactory();
try {
prf.saveProject(project);
ShowStandardAction.getInstance().doRun();
if (needCodeGen) {
IComponentsFactory components = ComponentsFactoryProvider.getInstance();
CorePlugin.getDefault().getCodeGeneratorService().refreshTemplates();
CorePlugin.getDefault().getLibrariesService().resetModulesNeeded();
}
// ComponentUtilities.updatePalette();
} catch (Exception ex) {
ExceptionHandler.process(ex);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
// TODO Auto-generated method stub
super.performDefaults();
retoreDefaultSettings();
}
/**
* bqian Comment method "retoreDefaultSettings".
*/
private void retoreDefaultSettings() {
ComponentsFactoryProvider.restoreComponentVisibilityStatus();
refreshViewer();
// getButton(IDialogConstants.OK_ID).setEnabled(true);
setValid(true);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#performCancel()
*/
@Override
public boolean performCancel() {
// TODO Auto-generated method stub
cancelPressed();
return super.performCancel();
}
protected void cancelPressed() {
for (Iterator iterator = statusBackup.keySet().iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
setComponentVisibleForRestore(name, statusBackup.get(name));
}
}
/*
* (non-Javadoc)
*
* @see org.talend.repository.preference.ProjectSettingPage#refresh()
*/
@Override
public void refresh() {
}
}