/*******************************************************************************
* 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.common.resref.ui;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.meta.XModelEntity;
import org.jboss.tools.common.meta.constraint.impl.XAttributeConstraintFileFilter;
import org.jboss.tools.common.meta.impl.XModelMetaDataImpl;
import org.jboss.tools.common.model.ui.action.CommandBar;
import org.jboss.tools.common.model.ui.action.CommandBarListener;
import org.jboss.tools.common.model.ui.objecteditor.XTable;
import org.jboss.tools.common.resref.core.ResourceReference;
import org.jboss.tools.common.resref.core.ResourceReferenceList;
public abstract class AbstractResourceReferencesComposite {
protected static String ADD = Messages.AbstractResourceReferencesComposite_Add;
protected static String EDIT = Messages.AbstractResourceReferencesComposite_Edit;
protected static String REMOVE = Messages.AbstractResourceReferencesComposite_Remove;
protected XTable table = new XTable();
protected CommandBar bar = new CommandBar();
protected ResourceReferencesTableProvider tableProvider;// = new TemplatesTableProvider();
protected IFile file;
protected IPath path;
protected List dataList = new ArrayList();
public AbstractResourceReferencesComposite() {
init();
}
private void init() {
tableProvider = createTableProvider(dataList);
bar.getLayout().buttonWidth = 80;
bar.getLayout().direction = SWT.VERTICAL;
bar.setCommands(new String[]{ADD, EDIT, REMOVE});
bar.addCommandBarListener(new BarListener());
table.setTableProvider(tableProvider);
}
protected abstract ResourceReferencesTableProvider createTableProvider(List dataList);
protected abstract ResourceReferenceList getReferenceList();
/**
* Returned the label that will display in group.
*
* @return label displayed in group
* @see #createControl(Composite)
*/
protected abstract String createGroupLabel();
public void setObject(Object object) {
Properties p = (Properties)object;
file = (IFile)p.get("file"); //$NON-NLS-1$
path = (IPath)p.get("path"); //$NON-NLS-1$
ResourceReference[] rs = (file != null) ? getReferenceList().getAllResources(file) :
(path != null) ? getReferenceList().getAllResources(path)
: new ResourceReference[0];
for (int i = 0; i < rs.length; i++) dataList.add(rs[i]);
}
public Control createControl(Composite parent) {
final Composite composite = new Composite(parent,SWT.NONE);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout g = new GridLayout(2, false);
composite.setLayout(g);
Control slc = table.createControl(composite);
slc.setLayoutData(new GridData(GridData.FILL_BOTH));
Control bc = bar.createControl(composite);
GridData gd = new GridData(GridData.FILL_VERTICAL);
bc.setLayoutData(gd);
table.getTable().addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
updateBars();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
update();
return composite;
}
protected ResourceReference[] getReferenceArray() {
return (ResourceReference[])dataList.toArray(new ResourceReference[0]);
}
/**
* Clear all entries from table.
*/
public void clearAll(){
if(this.dataList!=null){
this.dataList.clear();
}
}
public void commit() {
if(file != null) {
getReferenceList().setAllResources(file, getReferenceArray());
} else {
getReferenceList().setAllResources(path, getReferenceArray());
}
}
public class BarListener implements CommandBarListener {
public void action(String command) {
int index = table.getSelectionIndex();
if(ADD.equals(command)) {
add(index);
} else if(EDIT.equals(command)) {
edit(index);
} else if(REMOVE.equals(command)) {
remove(index);
}
update();
}
}
abstract protected void add(int index);
/**
* @return
*/
protected ResourceReference getDefaultResourceReference() {
return new ResourceReference("", ResourceReference.FOLDER_SCOPE); //$NON-NLS-1$
}
abstract protected void edit(int index);
protected abstract String getEntity();
void remove(int index) {
if(index >= 0) dataList.remove(index);
}
public void update() {
if(table != null) table.update();
updateBars();
}
protected void updateBars() {
boolean canModify = table.getSelectionIndex() >= 0;
bar.setEnabled(EDIT, canModify);
bar.setEnabled(REMOVE, canModify);
}
protected void initFilterInFileChooser() {
String entityName = getEntity();
XModelEntity entity = XModelMetaDataImpl.getInstance().getEntity(entityName);
if(entity != null && file != null && file.getProject() != null) {
XAttribute[] as = entity.getAttributes();
for (int i = 0; i < as.length; i++) {
if(as[i].getConstraint() instanceof XAttributeConstraintFileFilter) {
XAttributeConstraintFileFilter f = (XAttributeConstraintFileFilter)as[i].getConstraint();
f.getProperties().setProperty("filterFolder", file.getProject().getLocation().toFile().getAbsolutePath()); //$NON-NLS-1$
}
}
}
}
}