package rocks.inspectit.ui.rcp.composite; import java.util.Objects; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ToolBar; import rocks.inspectit.shared.all.cmr.model.PlatformIdent; import rocks.inspectit.shared.cs.storage.IStorageData; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.formatter.ImageFormatter; import rocks.inspectit.ui.rcp.formatter.TextFormatter; import rocks.inspectit.ui.rcp.repository.CmrRepositoryChangeListener; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus; import rocks.inspectit.ui.rcp.repository.RepositoryDefinition; import rocks.inspectit.ui.rcp.repository.StorageRepositoryDefinition; import rocks.inspectit.ui.rcp.storage.listener.StorageChangeListener; import rocks.inspectit.ui.rcp.util.AccessibleArrowImage; import rocks.inspectit.ui.rcp.util.SafeExecutor; /** * A composite to be the head client of the form that * {@link rocks.inspectit.ui.rcp.editor.root.FormRootEditor} is made of. * * @author Ivan Senic * */ public class BreadcrumbTitleComposite extends Composite implements CmrRepositoryChangeListener, StorageChangeListener { /** * Maximum text length for the label content. */ private static final int MAX_TEXT_LENGTH = 30; /** * Arrow to be displayed between the breadcrumbs. */ private final Image arrow; /** * {@link ToolBarManager} of the composite. */ private ToolBarManager toolBarManager; /** * Displayed repository definition. */ private RepositoryDefinition repositoryDefinition; /** * Label for repository name. */ private CLabel repositoryLabel; /** * Label for agent name. */ private CLabel agentLabel; /** * Label for group description. */ private CLabel groupLabel; /** * Label for view description. */ private CLabel viewLabel; /** * Default constructor. * * @param parent * Parent composite. * @param style * Style. * @see Composite#Composite(Composite, int) */ public BreadcrumbTitleComposite(Composite parent, int style) { super(parent, style); arrow = new AccessibleArrowImage(true).createImage(); init(); } /** * Initializes the widget. */ private void init() { // define layout GridLayout gridLayout = new GridLayout(2, false); gridLayout.marginHeight = 0; gridLayout.marginWidth = 0; setLayout(gridLayout); Composite breadcrumbComposite = new Composite(this, SWT.NONE); breadcrumbComposite.setLayout(new GridLayout(7, false)); breadcrumbComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); repositoryLabel = new CLabel(breadcrumbComposite, SWT.NONE); repositoryLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); new Label(breadcrumbComposite, SWT.NONE).setImage(arrow); agentLabel = new CLabel(breadcrumbComposite, SWT.NONE); agentLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); new Label(breadcrumbComposite, SWT.NONE).setImage(arrow); groupLabel = new CLabel(breadcrumbComposite, SWT.NONE); groupLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); new Label(breadcrumbComposite, SWT.NONE).setImage(arrow); viewLabel = new CLabel(breadcrumbComposite, SWT.NONE); viewLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); // create tool-bar and its manager ToolBar toolbar = new ToolBar(this, SWT.FLAT); toolbar.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false)); toolBarManager = new ToolBarManager(toolbar); } /** * Gets {@link #toolBarManager}. * * @return {@link #toolBarManager} */ public ToolBarManager getToolBarManager() { return toolBarManager; } /** * Sets {@link #repositoryDefinition}. * * @param repositoryDefinition * New value for {@link #repositoryDefinition} */ public void setRepositoryDefinition(RepositoryDefinition repositoryDefinition) { this.repositoryDefinition = repositoryDefinition; repositoryLabel.setText(TextFormatter.clearLineBreaks(TextFormatter.crop(repositoryDefinition.getName(), MAX_TEXT_LENGTH))); if (repositoryDefinition instanceof CmrRepositoryDefinition) { repositoryLabel.setImage(ImageFormatter.getCmrRepositoryImage((CmrRepositoryDefinition) repositoryDefinition, true)); InspectIT.getDefault().getCmrRepositoryManager().addCmrRepositoryChangeListener(this); } else if (repositoryDefinition instanceof StorageRepositoryDefinition) { repositoryLabel.setImage(ImageFormatter.getStorageRepositoryImage((StorageRepositoryDefinition) repositoryDefinition)); InspectIT.getDefault().getInspectITStorageManager().addStorageChangeListener(this); } } /** * Sets the agent name. * * @param agentName * Agent name. * @param agentImg * Image to go next to the agent name. If <code>null</code> is passed no changed to * the current image will be done. */ public void setAgent(String agentName, Image agentImg) { agentLabel.setText(TextFormatter.clearLineBreaks(TextFormatter.crop(agentName, MAX_TEXT_LENGTH))); agentLabel.setToolTipText(agentName); if (null != agentImg) { agentLabel.setImage(agentImg); } } /** * Sets the title text and image. * * @param group * Group description. * @param groupdImg * Image to go next to the title. If <code>null</code> is passed no changed to the * current image will be done. */ public void setGroup(String group, Image groupdImg) { groupLabel.setText(TextFormatter.clearLineBreaks(TextFormatter.crop(group, MAX_TEXT_LENGTH))); groupLabel.setToolTipText(group); if (null != groupdImg) { groupLabel.setImage(groupdImg); } layoutInternal(); } /** * Sets the description. * * @param view * View description. * @param viewImg * Image to go next to the view description. If <code>null</code> is passed no * changed to the current image will be done. */ public void setView(String view, Image viewImg) { viewLabel.setText(TextFormatter.clearLineBreaks(view)); viewLabel.setToolTipText(view); if (null != viewImg) { viewLabel.setImage(viewImg); } layoutInternal(); } /** * {@inheritDoc} */ @Override public void repositoryOnlineStatusUpdated(CmrRepositoryDefinition cmrRepositoryDefinition, OnlineStatus oldStatus, OnlineStatus newStatus) { if ((newStatus != OnlineStatus.CHECKING) && Objects.equals(repositoryDefinition, cmrRepositoryDefinition)) { SafeExecutor.asyncExec(new Runnable() { @Override public void run() { repositoryLabel.setImage(ImageFormatter.getCmrRepositoryImage((CmrRepositoryDefinition) repositoryDefinition, true)); } }, getDisplay(), repositoryLabel); } } /** * {@inheritDoc} */ @Override public void repositoryDataUpdated(CmrRepositoryDefinition cmrRepositoryDefinition) { if (Objects.equals(repositoryDefinition, cmrRepositoryDefinition)) { SafeExecutor.asyncExec(new Runnable() { @Override public void run() { repositoryLabel.setText(TextFormatter.clearLineBreaks(repositoryDefinition.getName())); layoutInternal(); } }, getDisplay(), repositoryLabel); } } /** * {@inheritDoc} */ @Override public void repositoryAgentDeleted(CmrRepositoryDefinition cmrRepositoryDefinition, PlatformIdent agent) { } /** * Layouts the widget so that the text is properly displayed on the composite. */ private void layoutInternal() { layout(true, true); } /** * {@inheritDoc} */ @Override public void repositoryAdded(CmrRepositoryDefinition cmrRepositoryDefinition) { } /** * {@inheritDoc} */ @Override public void repositoryRemoved(CmrRepositoryDefinition cmrRepositoryDefinition) { } /** * {@inheritDoc} */ @Override public void storageDataUpdated(IStorageData storageData) { updateStorageDetailsIfDisplayed(storageData); } /** * {@inheritDoc} */ @Override public void storageRemotelyDeleted(IStorageData storageData) { updateStorageDetailsIfDisplayed(storageData); } /** * {@inheritDoc} */ @Override public void storageLocallyDeleted(IStorageData storageData) { updateStorageDetailsIfDisplayed(storageData); } /** * Updates storage name and icon if given storageData is displayed currently on the breadcrumb. * * @param storageData * {@link IStorageData} */ private void updateStorageDetailsIfDisplayed(IStorageData storageData) { if (repositoryDefinition instanceof StorageRepositoryDefinition) { final StorageRepositoryDefinition storageRepositoryDefinition = (StorageRepositoryDefinition) repositoryDefinition; if (Objects.equals(storageRepositoryDefinition.getLocalStorageData(), storageData)) { SafeExecutor.asyncExec(new Runnable() { @Override public void run() { repositoryLabel.setText(TextFormatter.clearLineBreaks(repositoryDefinition.getName())); repositoryLabel.setImage(ImageFormatter.getStorageRepositoryImage(storageRepositoryDefinition)); layoutInternal(); } }, getDisplay(), repositoryLabel); } } } /** * Returns textual representation of the displayed data for the copy purposes. * * @return Returns textual representation of the displayed data for the copy purposes. */ public String getCopyString() { StringBuilder sb = new StringBuilder(); sb.append(repositoryLabel.getText()); sb.append(" > "); sb.append(agentLabel.getText()); if (null != groupLabel.getText()) { sb.append(" > "); sb.append(groupLabel.getText()); } if (null != viewLabel.getText()) { sb.append(" > "); sb.append(viewLabel.getText()); } return sb.toString(); } /** * {@inheritDoc} */ @Override public void dispose() { arrow.dispose(); InspectIT.getDefault().getCmrRepositoryManager().removeCmrRepositoryChangeListener(this); InspectIT.getDefault().getInspectITStorageManager().removeStorageChangeListener(this); super.dispose(); } }