package com.netifera.platform.ui.tasks.list; import org.eclipse.jface.resource.FontRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; import com.netifera.platform.api.probe.IProbe; import com.netifera.platform.api.tasks.ITaskClient; import com.netifera.platform.api.tasks.ITaskRecord; import com.netifera.platform.ui.internal.tasks.TasksPlugin; import com.netifera.platform.ui.internal.tasks.util.ProgressBarStack; import com.netifera.platform.ui.tasks.output.TaskOutputView; public class TaskItem extends Composite { private static final String STOP_TASK_IMAGE = "icons/stop_task.png"; private static final String STOP_TASK_GRAY_IMAGE = "icons/stop_task_gray.png"; private Composite titleComposite; private Label titleImage; private Label titleLabel; private Composite progressComposite; private ProgressBarStack progress; private ImageHyperlink cancelButton; private boolean cancelDisabled; // private ImageHyperlink messageLink; private Composite statusComposite; private Label statusLabel; private ImageHyperlink outputLink; private TaskLabelProvider labelProvider = new TaskLabelProvider(); // private TaskOutputTableLabelProvider outputLabelProvider = new TaskOutputTableLabelProvider(); public TaskItem(final Composite parent, int style, FormToolkit toolkit) { super(parent, style); final TableWrapLayout layout = new TableWrapLayout(); setLayout(layout); toolkit.adapt(this); toolkit.paintBordersFor(this); createTitle(toolkit, style); createProgress(toolkit); // createMessage(toolkit); createStatus(toolkit); addHoverHandler(); this.layout(true); //this.setLayoutDeferred(true); } private void createTitle(FormToolkit toolkit, int style) { titleComposite = toolkit.createComposite(this, style); TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP); titleComposite.setLayoutData(layoutData); final TableWrapLayout layout = new TableWrapLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = false; layout.leftMargin = layout.rightMargin = layout.topMargin = layout.bottomMargin = 0; titleComposite.setLayout(layout); titleImage = toolkit.createLabel(titleComposite, "", style); layoutData = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP); layoutData.colspan = 1; titleImage.setLayoutData(layoutData); titleLabel = toolkit.createLabel(titleComposite, "Untitled Task", SWT.WRAP); titleLabel.setFont(getTitleFont()); layoutData = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP); layoutData.colspan = 1; titleLabel.setLayoutData(layoutData); } private Font getTitleFont() { FontRegistry fontRegistry = PlatformUI.getWorkbench().getThemeManager() .getCurrentTheme().getFontRegistry(); /* default font with bold style, could be defined in a theme */ Font titleFont = fontRegistry.getBold(JFaceResources.DEFAULT_FONT); return titleFont; } private void createProgress(FormToolkit toolkit) { progressComposite = toolkit.createComposite(this); TableWrapData layoutData = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP); progressComposite.setLayoutData(layoutData); final TableWrapLayout layout = new TableWrapLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = false; layout.leftMargin = layout.rightMargin = layout.topMargin = layout.bottomMargin = 0; progressComposite.setLayout(layout); progress = new ProgressBarStack(progressComposite); layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP); layoutData.heightHint = 16; layoutData.grabHorizontal = true; progress.setLayoutData(layoutData); toolkit.adapt(progress); cancelButton = toolkit.createImageHyperlink(progressComposite, SWT.NONE); cancelButton.setToolTipText("Cancel Task"); cancelButton.setImage(TasksPlugin.getPlugin().getImageCache().get(STOP_TASK_IMAGE)); layoutData = new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP); layoutData.grabHorizontal = false; layoutData.maxWidth = 20; cancelButton.setLayoutData(layoutData); cancelButton.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { doCancel(); } }); } /* private void createMessage(FormToolkit toolkit) { messageLink = toolkit.createImageHyperlink(this, SWT.NONE); messageLink.setFont(JFaceResources.getDialogFont()); messageLink.setText(""); messageLink.setForeground(getForeground()); messageLink.setUnderlined(false); messageLink.setVisible(false); messageLink.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { doOpenOutput(); } }); } private void handleTaskOutput(TaskLogOutput log) { if (messageLink == null || messageLink.isDisposed()) return; messageLink.setText(outputLabelProvider.getColumnText(log, 1)); if (log.isInfo()) messageLink.setImage(null); else messageLink.setImage(outputLabelProvider.getColumnImage(log, 1)); } */ private void createStatus(FormToolkit toolkit) { statusComposite = toolkit.createComposite(this); TableWrapData layoutData = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP); statusComposite.setLayoutData(layoutData); final TableWrapLayout layout = new TableWrapLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = false; layout.leftMargin = layout.rightMargin = layout.topMargin = layout.bottomMargin = 0; statusComposite.setLayout(layout); statusLabel = toolkit.createLabel(statusComposite, "Unknown status"); statusLabel.setFont(JFaceResources.getDialogFont()); layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP); statusLabel.setLayoutData(layoutData); outputLink = toolkit.createImageHyperlink(statusComposite, SWT.NONE); // outputSection.setFont(titleLabel.getFont()); outputLink.setFont(JFaceResources.getDialogFont()); outputLink.setText("details.."); layoutData = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP); outputLink.setLayoutData(layoutData); outputLink.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { doOpenOutput(); } }); } @Override public void setData(Object data) { super.setData(data); if(data instanceof ITaskRecord) { ITaskRecord taskRecord = (ITaskRecord) data; String title = taskRecord.getTitle(); if (title != null && !titleLabel.isDisposed()) titleLabel.setText(title); titleImage.setImage(labelProvider.getImage(taskRecord)); String status = taskRecord.getStatus(); if (status == null) status = taskRecord.getStateDescription(); if (taskRecord.isFinished()) status = "Completed"; if (taskRecord.isFinished() || taskRecord.isFailed()) { status = status+" ("+labelProvider.getElapsedTime(taskRecord)+")"; /* List<ITaskOutput> output = taskRecord.getTaskOutput(); for (int i=output.size()-1; i>=0; i--) { if (output.get(i) instanceof TaskLogOutput) { handleTaskOutput((TaskLogOutput) output.get(i)); // outputLink.setVisible(false); break; } } */ } if (!statusLabel.isDisposed()) { statusLabel.setText(status); } /* if(taskRecord.isRunning()) { enableCancel(); } else { disableCancel(); } */ if (taskRecord.isFinished() || taskRecord.isFailed()) { if (!progress.isDisposed()) progress.dispose(); if (!cancelButton.isDisposed()) cancelButton.dispose(); if (!progressComposite.isDisposed()) { progressComposite.setVisible(false); progressComposite.dispose(); // messageLink.setVisible(true); } } else { int worked = taskRecord.getWorkDone(); if (worked > 0 && !progress.isDisposed()) { progress.setSelection(taskRecord.getWorkDone()); } } } } @Override public void setBackground(Color color) { super.setBackground(color); if (titleComposite == null) return; // still not initialized if (!titleComposite.isDisposed()) titleComposite.setBackground(color); if (!titleImage.isDisposed()) titleImage.setBackground(color); if (!titleLabel.isDisposed()) titleLabel.setBackground(color); if (!progressComposite.isDisposed()) progressComposite.setBackground(color); if (!progress.isDisposed()) { progress.setBackground(color); cancelButton.setBackground(color); } // if (!messageLink.isDisposed()) // messageLink.setBackground(color); if (!statusComposite.isDisposed()) statusComposite.setBackground(color); if (!statusLabel.isDisposed()) statusLabel.setBackground(color); if (!outputLink.isDisposed()) outputLink.setBackground(color); } @Override public void addMouseListener(MouseListener listener) { super.addMouseListener(listener); if (titleComposite == null) return; // still not initialized if (!titleComposite.isDisposed()) titleComposite.addMouseListener(listener); if (!titleImage.isDisposed()) titleImage.addMouseListener(listener); if (!titleLabel.isDisposed()) titleLabel.addMouseListener(listener); if (!progressComposite.isDisposed()) progressComposite.addMouseListener(listener); if (!progress.isDisposed()) { progress.addMouseListener(listener); } if (!statusComposite.isDisposed()) statusComposite.addMouseListener(listener); if (!statusLabel.isDisposed()) statusLabel.addMouseListener(listener); } @Override public void dispose() { titleComposite.dispose(); titleImage.dispose(); titleLabel.dispose(); progressComposite.dispose(); progress.dispose(); cancelButton.dispose(); // messageLink.dispose(); statusComposite.dispose(); statusLabel.dispose(); outputLink.dispose(); super.dispose(); } /* private void disableCancel() { if(cancelDisabled || cancelButton.isDisposed()) { return; } cancelButton.setImage(TasksPlugin.getPlugin().getImageCache().get(STOP_TASK_GRAY_IMAGE)); cancelDisabled = true; } private void enableCancel() { if(!cancelDisabled || cancelButton.isDisposed()) { return; } cancelButton.setImage(TasksPlugin.getPlugin().getImageCache().get(STOP_TASK_IMAGE)); cancelDisabled = false; }*/ private void doCancel() { if(cancelDisabled) return; ITaskRecord record = (ITaskRecord) getData(); if (record == null) return; IProbe probe = TasksPlugin.getPlugin().getProbeManager().getProbeById(record.getProbeId()); ITaskClient client = probe.getTaskClient(); client.requestCancel(record.getTaskId()); } private void doOpenOutput() { if (!(getData() instanceof ITaskRecord)) return; ITaskRecord task = (ITaskRecord) getData(); try { IViewPart view; view = TasksPlugin.getPlugin().getWorkbench().getActiveWorkbenchWindow().getActivePage().showView( TaskOutputView.ID, "Task-"+task.getTaskId(), IWorkbenchPage.VIEW_ACTIVATE); ((TaskOutputView)view).setInput(task); } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void addHoverHandler() { MouseTrackAdapter listener = new MouseTrackAdapter() { public void mouseHover(MouseEvent e) { final Point p = PlatformUI.getWorkbench().getDisplay().map(TaskItem.this, null, e.x, e.y); new TaskHover(TaskItem.this.getShell(), p, (ITaskRecord)TaskItem.this.getData()).open(); } }; // this.addMouseTrackListener(listener); // titleComposite.addMouseTrackListener(listener); // titleImage.addMouseTrackListener(listener); // titleLabel.addMouseTrackListener(listener); // progressComposite.addMouseTrackListener(listener); // progress.addMouseTrackListener(listener); // statusComposite.addMouseTrackListener(listener); // statusLabel.addMouseTrackListener(listener); outputLink.addMouseTrackListener(listener); // messageLink.addMouseTrackListener(listener); } }