/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.preferences;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.ui.objecteditor.XChildrenEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.engines.impl.EnginesLoader;
import org.jboss.tools.common.model.util.AbstractTableHelper;
import org.jboss.tools.jsf.messages.JSFUIMessages;
import org.jboss.tools.jsf.project.capabilities.JSFCapabilities;
public class JSFCapabilitiesPreferencesPage extends PreferencePage implements IWorkbenchPreferencePage {
public static final String ID = "org.jboss.tools.jsf.ui.capabilities"; //$NON-NLS-1$
static String[] CAPABILITIES_HEADER = new String[]{"name"};
static String[] FILE_ADDITIONS_HEADER = new String[]{"label"};
static String[] LIB_REFERENCE_HEADER = new String[]{"name"};
JSFCapabilities capabilities;
XModelObject copy;
XChildrenEditor capabilityList;
XChildrenEditor fileAdditionList;
XChildrenEditor librarySetList;
public JSFCapabilitiesPreferencesPage() {
noDefaultAndApplyButton();
}
public void init(IWorkbench workbench) {
capabilities = JSFCapabilities.getInstance();
copy = capabilities.copy();
}
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
composite.setLayout(layout);
createCapabilityList();
Control c = capabilityList.createControl(composite);
c.setLayoutData(new GridData(GridData.FILL_BOTH));
createLibrarySetList();
createFileAdditionList();
TabFolder folder = new TabFolder(composite, SWT.NONE);
folder.setLayoutData(new GridData(GridData.FILL_BOTH));
TabItem item = new TabItem(folder, SWT.NONE);
item.setText(JSFUIMessages.LIBRARY_SETS);
c = librarySetList.createControl(folder);
c.setLayoutData(new GridData(GridData.FILL_BOTH));
item.setControl(c);
item = new TabItem(folder, SWT.NONE);
item.setText(JSFUIMessages.CONFIGURATION_FILE_ADDITIONS);
c = fileAdditionList.createControl(folder);
c.setLayoutData(new GridData(GridData.FILL_BOTH));
item.setControl(c);
initSelection();
return composite;
}
private void initSelection() {
if(copy == null || copy.getChildren().length == 0) return;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if(capabilityList.getControl() == null || capabilityList.getControl().isDisposed()) {
return;
}
capabilityList.getSelectionProvider().setSelection(new StructuredSelection(copy.getChildren()[0]));
capabilityList.update();
capabilitySelectionChanged();
}
});
}
private void createCapabilityList() {
capabilityList = new XChildrenEditor() {
protected String getAddActionPath() {
return "CreateActions.AddCapability"; //$NON-NLS-1$
}
protected AbstractTableHelper createHelper() {
return new AbstractTableHelper() {
public String[] getHeader() {
return CAPABILITIES_HEADER;
}
};
}
};
capabilityList.setObject(copy);
capabilityList.getSelectionProvider().addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
capabilitySelectionChanged();
}
});
capabilityList.setHeaderVisible(false);
}
private void createLibrarySetList() {
librarySetList = new XChildrenEditor() {
protected String getAddActionPath() {
return "CreateActions.AddLibraryReference"; //$NON-NLS-1$
}
protected void edit() {
XModelObject o = helper.getModelObject(xtable.getSelectionIndex());
if(o != null) callAction(o, "EditActions.Edit"); //$NON-NLS-1$
}
protected AbstractTableHelper createHelper() {
return new AbstractTableHelper() {
public int size() {
return (object == null) ? 0 : object.getChildren("JSFLibraryReference").length; //$NON-NLS-1$
}
public XModelObject getModelObject(int r) {
if(object == null) return null;
XModelObject[] cs = object.getChildren("JSFLibraryReference"); //$NON-NLS-1$
return (r < 0 || r >= cs.length) ? null : cs[r];
}
public String[] getHeader() {
return LIB_REFERENCE_HEADER;
}
};
}
};
librarySetList.setHeaderVisible(false);
}
private void createFileAdditionList() {
fileAdditionList = new XChildrenEditor() {
protected String getAddActionPath() {
return "CreateActions.AddFileAddition"; //$NON-NLS-1$
}
protected void edit() {
XModelObject o = helper.getModelObject(xtable.getSelectionIndex());
if(o != null) callAction(o, "EditActions.Edit"); //$NON-NLS-1$
}
protected AbstractTableHelper createHelper() {
return new AbstractTableHelper() {
public int size() {
return (object == null) ? 0 : object.getChildren("JSFFileAddition").length; //$NON-NLS-1$
}
public XModelObject getModelObject(int r) {
if(object == null) return null;
XModelObject[] cs = object.getChildren("JSFFileAddition"); //$NON-NLS-1$
return (r < 0 || r >= cs.length) ? null : cs[r];
}
public String[] getHeader() {
return FILE_ADDITIONS_HEADER;
}
};
}
};
fileAdditionList.setHeaderVisible(false);
}
private void capabilitySelectionChanged() {
XModelObject selection = capabilityList.getSelectedObject();
librarySetList.setObject(selection);
librarySetList.update();
fileAdditionList.setObject(selection);
fileAdditionList.update();
}
public boolean performCancel() {
copy = capabilities.copy();
return super.performCancel();
}
public boolean performOk() {
long ts = capabilities.getTimeStamp();
try {
EnginesLoader.merge(capabilities, copy);
} catch (XModelException e) {
ModelPlugin.getPluginLog().logError(e);
}
if(ts != capabilities.getTimeStamp()) {
capabilities.setModified(ts != capabilities.getTimeStamp());
capabilities.save();
}
return super.performOk();
}
}