/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.wizard;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IPageChangeProvider;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.hundsun.ares.studio.core.ConsoleHelper;
import com.hundsun.ares.studio.ui.template.Template;
/**
* ģ��ѡ��ҳ��
* @author sundl
*/
public class TemplateSelectWizardPage extends WizardPage{
private static final Logger console = ConsoleHelper.getLogger();
private List<Template> templates = new ArrayList<Template>();
private String remoteUrl;
private Template selectedTemplate;
private TableViewer templateViewer;
private FormBrowser formBrowser;
private Job refreshJob;
protected TemplateSelectWizardPage() {
super("template_select");
setDescription("ѡ��ģ��");
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridDataFactory.fillDefaults().applyTo(composite);
GridLayoutFactory.fillDefaults().applyTo(composite);
SashForm sashForm = new SashForm(composite, SWT.HORIZONTAL);
//sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridDataFactory.fillDefaults().hint(300, 200).grab(true, true).applyTo(sashForm);
createTableViewer(sashForm);
formBrowser = new FormBrowser(SWT.V_SCROLL | SWT.BORDER);
formBrowser.createControl(sashForm);
formBrowser.setText("");
templateViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection ss = (IStructuredSelection) event.getSelection();
Object element = ss.getFirstElement();
if (element instanceof Template) {
formBrowser.setText(StringUtils.defaultString(((Template) element).getDescription()));
selectedTemplate = (Template) element;
setPageComplete(true);
}
}
});
createRemoteGroup(composite);
createRefreshGroup(composite);
setPageComplete(false);
setControl(composite);
IWizardContainer container = getWizard().getContainer();
if (container instanceof IPageChangeProvider) {
((IPageChangeProvider) container).addPageChangedListener(new IPageChangedListener() {
@Override
public void pageChanged(PageChangedEvent event) {
if (event.getSelectedPage() == TemplateSelectWizardPage.this) {
refreshTemplateList();
}
}
});
}
}
public Template getSelectedTemplate() {
return selectedTemplate;
}
private void createTableViewer(Composite parent) {
templateViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.BORDER | SWT.V_SCROLL);
templateViewer.setContentProvider(new ArrayContentProvider());
templateViewer.setLabelProvider(new TableLabelProvider());
//templateViewer.setInput(loadTemplateList());
}
private void createRemoteGroup(Composite composite) {
Composite remoteGroup = new Composite(composite, SWT.NONE);
GridDataFactory.fillDefaults().applyTo(remoteGroup);
GridLayoutFactory.fillDefaults().numColumns(3).applyTo(remoteGroup);
Label lbRemote = new Label(remoteGroup, SWT.NONE);
lbRemote.setText("����ģ����ַ:");
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).applyTo(lbRemote);
final Text textUrl = new Text(remoteGroup, SWT.BORDER);
IDialogSettings ds = getDialogSettings();
String url = StringUtils.defaultString(ds.get("remote_url"), "ftp://aresstudio:at2re@192.168.51.31/ProjectTemplate/");
textUrl.setText(url);
remoteUrl = url;
GridDataFactory.fillDefaults().grab(true, false).applyTo(textUrl);
textUrl.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
remoteUrl = textUrl.getText();
IDialogSettings settings = getDialogSettings();
settings.put("remote_url", remoteUrl);
}
});
}
private void createRefreshGroup(Composite composite) {
Composite group = new Composite(composite, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).applyTo(group);
GridDataFactory.fillDefaults().applyTo(group);
Button btRefresh = new Button(group, SWT.PUSH);
btRefresh.setText("ˢ��ģ���б�...");
btRefresh.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshTemplateList();
}
});
Button btAddLocal = new Button(group, SWT.PUSH);
btAddLocal.setText("��ӱ���ģ��...");
btAddLocal.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(getShell());
dialog.setFilterExtensions(new String[] {"*.zip", "*.*"});
String path = dialog.open();
if (path == null)
return;
File file = new File(path);
if (!file.exists()) {
MessageDialog.openError(getShell(), "����", "�ļ������ڣ�");
}
if (isTemplateAreadyInList(path)) {
MessageDialog.openError(getShell(), "����", "ģ���ļ��Ѿ������б��У�");
return;
}
try {
Template template = readTemplateInfo(file);
if (template != null) {
templates.add(template);
templateViewer.refresh();
saveLocalTemplates();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
MessageDialog.openError(getShell(), "����", String.format("��ȡ�ļ�%ʧ�ܣ��������ļ���ʽ����ȷ�������ļ�����������ռ��", path));
}
}
});
}
private boolean isTemplateAreadyInList(String path) {
for (Template t : templates) {
if (t.isLocal() && StringUtils.equals(t.getPath(), path))
return true;
}
return false;
}
private void createRefreshJob() {
refreshJob = new Job("��ȡģ���б�") {
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask("��ȡģ���б�", IProgressMonitor.UNKNOWN);
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
templateViewer.setInput(new Template[0]);
formBrowser.setText("���ڶ�ȡģ���б�...");
}
});
try {
templates.clear();
List<Template> remotTemplates = loadRemoteTemplates();
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
templates.addAll(remotTemplates);
List<Template> localTemplates = loadLocalTemplates();
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
templates.addAll(localTemplates);
} catch (IOException e) {
e.printStackTrace();
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
MessageDialog.openError(getShell(), "����", "��ȡ����ģ���б�ʱ���ִ������ǵ�ַ����ȷ�����粻ͨ.");
}
});
console.error("��ȡ����ģ���б�ʱ���ִ������ǵ�ַ����ȷ�����粻ͨ.", e);
}
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
templateViewer.setInput(templates);
formBrowser.setText("");
}
});
return Status.OK_STATUS;
}
};
refreshJob.setUser(true);
}
private void refreshTemplateList() {
if (refreshJob == null)
createRefreshJob();
refreshJob.cancel();
refreshJob.schedule();
}
/**
* ����Զ��ģ���б�
* @return
* @throws IOException
*/
private List<Template> loadRemoteTemplates() throws IOException {
List<Template> templates = new ArrayList<Template>();
String indexFileUrl = remoteUrl + "/" + "index.xml";
URL url = new URL(indexFileUrl);
InputStream is = url.openStream();
Resource resource = new XMIResourceImpl();
resource.load(is, null);
for (EObject eObject : resource.getContents()) {
if (eObject instanceof Template) {
Template template = (Template) eObject;
template.setPath(remoteUrl + "/" + template.getPath());
templates.add((Template) eObject);
}
}
return templates;
}
private List<Template> loadLocalTemplates() {
List<Template> templates = new ArrayList<Template>();
IDialogSettings settings = getDialogSettings();
String[] paths = settings.getArray("local_templates");
if (paths != null) {
for (String path : paths) {
if (path == null)
continue;
File file = new File(path);
if (!file.exists()) {
continue;
}
try {
Template t = readTemplateInfo(file);
if (t != null)
templates.add(t);
} catch (IOException e) {
e.printStackTrace();
console.error(String.format("��ȡģ���ļ�%s��ʱ����������ļ���ʽ����ȷ���ļ�����������ռ��.", file.getPath()), e);
}
}
}
return templates;
}
private void saveLocalTemplates() {
List<String> localTemplates = new ArrayList<String>();
for (Template t : templates) {
if (t.isLocal())
localTemplates.add(t.getPath());
}
IDialogSettings settings = getDialogSettings();
settings.put("local_templates", localTemplates.toArray(new String[0]));
}
private Template readTemplateInfo(File file) throws IOException {
ZipFile zipFile = null;
try {
zipFile = new ZipFile(file);
ZipArchiveEntry entry = zipFile.getEntry("template.xml");
if (entry != null) {
InputStream is = zipFile.getInputStream(entry);
Template template = readTemplateInfo(is);
template.setLocal(true);
template.setPath(file.getPath());
return template;
}
} finally {
ZipFile.closeQuietly(zipFile);
}
return null;
}
private Template readTemplateInfo(InputStream inputStream) throws IOException {
Resource resource = new XMIResourceImpl();
resource.load(inputStream, null);
if (resource.getContents().size() > 0) {
return (Template) resource.getContents().get(0);
}
return null;
}
static class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object o, int index) {
if (o instanceof Template) {
Template t = (Template) o;
String text = t.getName();
if (t.isLocal())
text += "(����)";
return text;
}
return getText(o);
}
public Image getColumnImage(Object o, int index) {
return getImage(o);
}
}
}