package org.nightlabs.jfire.issuetracking.ui.issue.editor; import java.util.Collection; import java.util.Set; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.editor.FormPage; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.resource.SharedImages; import org.nightlabs.base.ui.wizard.DynamicPathWizardDialog; import org.nightlabs.jfire.issue.Issue; import org.nightlabs.jfire.issue.issuemarker.IssueMarker; import org.nightlabs.jfire.issuetracking.ui.issue.editor.issueMarker.AddIssueMarkerWizard; import org.nightlabs.jfire.issuetracking.ui.issue.editor.issueMarker.IssueMarkerTable; import org.nightlabs.jfire.issuetracking.ui.resource.Messages; /** * A section for the {@link IssueEditorGeneralPage} to handle the interface mechanisms for the * {@link IssueMarker}. * * @author Khaireel Mohamed - khaireel at nightlabs dot de */ public class IssueMarkerSection extends AbstractIssueEditorGeneralSection { private IssueMarkerTable issueMarkerTable; private AddIssueMarkerAction addIssueMarkerAction; private RemoveIssueMarkerAction removeIssueMarkerAction; /** * Creates a new instance of the IssueMarkerSection. */ public IssueMarkerSection(FormPage page, Composite parent, final IssueEditorPageController controller) { super(page, parent, controller); getSection().setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.IssueMarkerSection.section.text")); //$NON-NLS-1$ getSection().setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); getSection().setLayout(new GridLayout()); XComposite client = new XComposite(getSection(), SWT.NONE, LayoutMode.TIGHT_WRAPPER); client.getGridLayout().numColumns = 1; // Top set of control buttons: To add and remove IssueMarkers. addIssueMarkerAction = new AddIssueMarkerAction(); getToolBarManager().add(addIssueMarkerAction); removeIssueMarkerAction = new RemoveIssueMarkerAction(); getToolBarManager().add(removeIssueMarkerAction); // The TableComposite displaying the IssueMarkers. issueMarkerTable = new IssueMarkerTable(client); issueMarkerTable.addSelectionChangedListener(new ISelectionChangedListener(){ @Override public void selectionChanged(SelectionChangedEvent event) { handleRemoveActionButton(); } }); // Place the TableComposite in this Section, ah, nicely. new IssueMarkerTableComposite(client, SWT.NONE, issueMarkerTable); getSection().setClient(client); updateToolBarManager(); } /* (non-Javadoc) * @see org.nightlabs.jfire.issuetracking.ui.issue.editor.AbstractIssueEditorGeneralSection#doSetIssue(org.nightlabs.jfire.issue.Issue) */ @Override protected void doSetIssue(Issue issue) { Set<IssueMarker> iMs = issue.getIssueMarkers(); boolean isMarkersExist = iMs != null && !iMs.isEmpty(); if (isMarkersExist) issueMarkerTable.setInput(iMs); getSection().setExpanded(isMarkersExist); handleRemoveActionButton(); } /** * Disables the Remove button if nothing on the table is selected. */ protected void handleRemoveActionButton() { assert removeIssueMarkerAction != null; removeIssueMarkerAction.setEnabled( issueMarkerTable.getSelectionIndex() >= 0 ); } // -----------------------------------------------------------------------------------------------------------------------------------| /** * Controls the placement of the IssueMarkerTable. */ private class IssueMarkerTableComposite extends XComposite { public IssueMarkerTableComposite(Composite parent, int style, IssueMarkerTable issueMarkerTable) { super(parent, style, LayoutMode.TIGHT_WRAPPER); getGridLayout().numColumns = 2; getGridLayout().makeColumnsEqualWidth = false; getGridData().grabExcessHorizontalSpace = true; GridData gridData = new GridData(GridData.FILL_BOTH); gridData.heightHint = 100; assert issueMarkerTable != null; issueMarkerTable.setLayoutData(gridData); } } // -----------------------------------------------------------------------------------------------------------------------------------| /** * Handles the action to add a new IssueMarker. */ private class AddIssueMarkerAction extends Action { public AddIssueMarkerAction() { setId(AddIssueMarkerAction.class.getName()); setImageDescriptor(SharedImages.ADD_16x16); setToolTipText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.IssueMarkerSection.addIssueMarkerAction.tooltip")); //$NON-NLS-1$ setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.IssueMarkerSection.addIssueMarkerAction.text")); //$NON-NLS-1$ } @Override public void run() { Issue issue = getIssue(); DynamicPathWizardDialog dialog = new DynamicPathWizardDialog( new AddIssueMarkerWizard(issue) ); dialog.open(); // React only when something was chosen from the Wizard. if (dialog.getReturnCode() != Window.CANCEL) { // Handles the case that the Table was previously empty. if (issueMarkerTable.getItemCount() == 0) { issueMarkerTable.setInput(issue.getIssueMarkers()); // <-- Only on first populate. getSection().setExpanded(true); } issueMarkerTable.refresh(true); markDirty(); } } } // -----------------------------------------------------------------------------------------------------------------------------------| /** * Handles the action to remove the selected IssueMarker(s). */ private class RemoveIssueMarkerAction extends Action { public RemoveIssueMarkerAction() { setId(RemoveIssueMarkerAction.class.getName()); setImageDescriptor(SharedImages.DELETE_16x16); setToolTipText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.IssueMarkerSection.deleteIssueMarkerAction.tooltip")); //$NON-NLS-1$ setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.IssueMarkerSection.deleteIssueMarkerAction.text")); //$NON-NLS-1$ } @Override public void run() { // Should I do this on Async?? Collection<IssueMarker> items = issueMarkerTable.getSelectedElements(); if (items.isEmpty()) return; Issue issue = getIssue(); for(IssueMarker issueMarker : items) { issueMarkerTable.removeElement(issueMarker); issue.removeIssueMarker(issueMarker); } // Done! markDirty(); } } }