/** * Դ�������ƣ�RefreshViewerJob.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.ui * ����˵����JRES Studio�Ľ���չ�ֻ�����ܺͱ༭��ع��� * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.ui.editor.viewers; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.builder.HashCodeBuilder; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.progress.UIJob; /** * @author yanwj06282 * */ public class SynRefreshViewerJob extends UIJob { private static Set<SynRefreshViewerJob> jobSet = new HashSet<SynRefreshViewerJob>(); private ColumnViewer viewer; private Object[] elements; private boolean updateLables; private Command cmd; private EStructuralFeature feature; /** * ָ��ˢ��һ����ͼ��ˢ�¹��̲�һ���Ǽ�ʱ�ģ�����ˢ�±�֤��Ӱ���û�����ͼ�ϵı༭��Ϊ TODO ��ͬ��ˢ�²������������ú�Ӧ��ֻ����һ�� * * @param viewer */ public static void refresh(ColumnViewer viewer, Object[] elements, boolean updateLables, Command cmd, EStructuralFeature feature) { SynRefreshViewerJob job = new SynRefreshViewerJob(viewer, elements, updateLables, cmd, feature); if (!jobSet.contains(job)) { jobSet.add(job); job.schedule(); job.addJobChangeListener(new JobChangeAdapter() { /* * (non-Javadoc) * * @see * org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse * .core.runtime.jobs.IJobChangeEvent) */ @Override public void done(IJobChangeEvent event) { jobSet.remove(event.getJob()); } }); } } public static void refresh(ColumnViewer viewer, Object[] elements, Command cmd, EStructuralFeature feature) { refresh(viewer, elements, true, cmd, feature); } public static void refresh(ColumnViewer viewer, Command cmd, EStructuralFeature feature) { refresh(viewer, null, true, cmd, feature); } /** * @param name */ private SynRefreshViewerJob(ColumnViewer viewer, Object[] elements, boolean updateLables, Command cmd, EStructuralFeature feature) { super("ˢ����ͼ"); this.viewer = viewer; setSystem(true); setPriority(SHORT); this.cmd = cmd; this.feature = feature; this.elements = elements; this.updateLables = updateLables; } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.jobs.Job#shouldRun() */ @Override public boolean shouldRun() { return !viewer.getControl().isDisposed(); } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.jobs.Job#shouldSchedule() */ @Override public boolean shouldSchedule() { return !viewer.getControl().isDisposed(); } /* * (non-Javadoc) * * @see * org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime. * IProgressMonitor) */ @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (viewer != null && !viewer.getControl().isDisposed()) { if (viewer.isCellEditorActive() || viewer.isBusy()) { this.schedule(getJobDelay()); } else { if (elements == null) { viewer.refresh(updateLables); } else { if (elements.length > 10) { viewer.refresh(); } else { viewer.update(elements, null); // �����������߲������,��Ҫ�����㶨λ������ if (cmd instanceof AddCommand && cmd.canExecute()) { if (viewer instanceof TableViewer) { Table table = ((TableViewer) viewer).getTable(); boolean status = false; for (TableItem item : table.getItems()) { if (item.getData() == cmd.getAffectedObjects().toArray()[0]) { status = true; } } if (status) { editElement(table.getColumnCount(), cmd.getAffectedObjects().toArray()[0]); } }else if (viewer instanceof TreeViewer) { Tree tree = ((TreeViewer) viewer).getTree(); boolean status = false; for (TreeItem item : tree.getItems()) { if (item.getData() == cmd.getAffectedObjects().toArray()[0]) { status = true; } } if (status) { editElement(tree.getColumnCount(),cmd.getAffectedObjects().toArray()[0]); } } } } } } } return Status.OK_STATUS; } private void editElement(int count, Object obj) { if (feature == null) { viewer.editElement(obj, 0); return; } for (int i = 0; i < count; i++) { CellLabelProvider pro = viewer.getLabelProvider(i); if (pro instanceof EObjectColumnLabelProvider) { EStructuralFeature f = ((EObjectColumnLabelProvider) pro).getEStructuralFeature(null); if (feature.equals(f)) { viewer.editElement(obj, i); break; } } if (i == count -1) { viewer.editElement(obj, 0); } } } protected long getJobDelay() { return 100; } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof SynRefreshViewerJob) { SynRefreshViewerJob other = (SynRefreshViewerJob) obj; if (this.updateLables = other.updateLables && this.viewer == other.viewer && ArrayUtils.isEquals(this.elements, other.elements)) { return true; } } return false; } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return new HashCodeBuilder().append(updateLables).append(viewer) .append(elements).toHashCode(); // return (updateLables ? 1 : -1) * (viewer.hashCode() + // ArrayUtils.hashCode(elements)); } }