/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.wizard;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.InvocationTargetException;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ui.IWorkbench;
import com.hundsun.ares.studio.core.IARESElement;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESModuleRoot;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.converter.IModelConverter;
import com.hundsun.ares.studio.core.registry.ARESResRegistry;
import com.hundsun.ares.studio.core.registry.IResDescriptor;
import com.hundsun.ares.studio.core.registry.ModuleRootType2ResTypeMap;
import com.hundsun.ares.studio.core.util.ArrayUtil;
import com.hundsun.ares.studio.ui.AresResourceCategoryFilter;
import com.hundsun.ares.studio.ui.AresResourceFilter;
import com.hundsun.ares.studio.ui.ElementSelectionWizardPageWithNameInput;
import com.hundsun.ares.studio.ui.LibFilter;
/**
* �½���Դ��ҳ��Ļ��ࡣ
* @author sundl
*/
public class ARESResourceWizardPage extends ElementSelectionWizardPageWithNameInput{
private static final Logger logger = Logger.getLogger(ARESResourceWizardPage.class.getName());
// ���ҳ�洴������Դ������
private String resType;
public ARESResourceWizardPage(String pageName, IWorkbench workbench, IARESElement selection, String resType) {
super(pageName, workbench, selection);
this.resType = resType;
}
@Override
public boolean validate() {
if (!(selection instanceof IARESModule)) {
setErrorMessage("��ѡ��һ��Ӧ��");
return false;
}
if(!super.validate()) {
return false;
}
String newName = getNewName();
IARESModule module = (IARESModule) selection;
IARESResource exsit = module.findResource(newName, resType);
if (exsit != null && exsit.exists()) {
setErrorMessage("ͬ����Դ�Ѿ����ڣ�");
return false;
}
return true;
}
/* (non-Javadoc)
* @see com.hundsun.ares.devtool.v2.ui.ARESElementSelectionWizardPage#finishPage()
*/
@Override
public boolean finishPage() {
try {
getContainer().run(false, false, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
createResource();
}
});
} catch (InvocationTargetException e) {
e.printStackTrace();
return false;
} catch (InterruptedException e) {
e.printStackTrace();
return false;
}
openEditorAndReveal();
return true;
}
protected void createResource() {
long t1 = System.currentTimeMillis();
IResDescriptor resDescriptor = ARESResRegistry.getInstance().getResDescriptor(getType());
if (resDescriptor != null) {
Object info = resDescriptor.createInfo();
initNewResourceInfo(info);
IModelConverter converter = resDescriptor.getConverter();
IARESElement selection = getSelectedElement();
if (selection.getResource().getType() == IResource.FOLDER) {
String name = getNewName();
name = name + "." + getType();
IFolder folder = (IFolder)selection.getResource();
IFile file = folder.getFile(name);
if (!file.exists()) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
converter.write(bos, info);
file.create(new ByteArrayInputStream(bos.toByteArray()), true, null);
} catch (Exception e) {
e.printStackTrace();
}
this.resource = file;
}
}
}
long t2 = System.currentTimeMillis();
logger.info("��Դ�� " + getNewName() + " �����ɹ�����ʱ" + (t2 - t1) + "ms.");
}
/**
* ��ʼ����Դ��Ϣ����
* ���������д���������ʼ��������Ϣ����Ҫ����super.initNewResourceInfo()
* @param info
*/
protected void initNewResourceInfo(Object info) {
// do nothing
}
/* (non-Javadoc)
* @see com.hundsun.ares.devtool.v2.ui.ARESElementSelectionWizardPage#getType()
*/
public String getType() {
return resType;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.ui.ARESElementSelectionWizardPage#getCreatedResource()
*/
@Override
public IResource getCreatedResource() {
if (resource == null) {
IARESElement selection = getSelectedElement();
if (selection.getResource().getType() == IResource.FOLDER) {
String name = getNewName();
name = name + "." + getType();
IFolder folder = (IFolder)selection.getResource();
resource = folder.getFile(name);
}
}
return resource;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.ui.CommonElementSelectionPage#addFilter()
* ����ģ�����������Դ
*
*/
@Override
protected void addFilter() {
if(viewer != null){
viewer.addFilter(new ViewerFilter(){
@Override
public boolean select(Viewer viewer, Object parentElement,
Object element) {
if(element instanceof IARESModuleRoot){
if(resType == null || resType.length() == 0){
return true;
}
String[] allowType = ModuleRootType2ResTypeMap.getInstance().getAllowedResTypes(((IARESModuleRoot) element).getType());
if(ArrayUtil.findInArray(allowType, resType) < 0){
return false;
}
}
return true;
}
});
viewer.addFilter(new LibFilter());
viewer.addFilter(new AresResourceCategoryFilter());
viewer.addFilter(new AresResourceFilter());
}
}
}