package rocks.inspectit.ui.rcp.preferences.page; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import rocks.inspectit.shared.all.cmr.model.PlatformIdent; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.InspectITImages; import rocks.inspectit.ui.rcp.dialog.AddCmrRepositoryDefinitionDialog; import rocks.inspectit.ui.rcp.preferences.PreferencesUtils; 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.CmrRepositoryManager; import rocks.inspectit.ui.rcp.util.SafeExecutor; import rocks.inspectit.ui.rcp.wizard.ManageLabelWizard; /** * Preference page for {@link CmrRepositoryDefinition} management. * <p> * <b>This class is not used at the moment. It's not confirmed that quality of the class in with the * standards, however, it can serve as an entry to future work regarding preferences.</b> * * @author Ivan Senic * */ public class CmrRepositoryPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, CmrRepositoryChangeListener { /** * {@link CmrRepositoryManager}. */ private CmrRepositoryManager cmrRepositoryManager; /** * Table with repositories. */ private TableViewer tableViewer; /** * Add button. */ private Button addButton; /** * Remove button. */ private Button removeButton; /** * Refresh button. */ private Button refreshButton; /** * Manage labels button. */ private Button manageLabelsButton; /** * Input list to save changes until Apply or OK are fired. */ private Map<CmrRepositoryDefinition, OnlineStatus> inputList; /** * Default constructor. */ public CmrRepositoryPreferencePage() { } /** * Sec. constructor. * * @param title * Title of preference page. */ public CmrRepositoryPreferencePage(String title) { super(title); } /** * Third constructor. * * @param title * Title of preference page. * @param image * Image. */ public CmrRepositoryPreferencePage(String title, ImageDescriptor image) { super(title, image); } /** * {@inheritDoc} */ @Override public void init(IWorkbench workbench) { cmrRepositoryManager = InspectIT.getDefault().getCmrRepositoryManager(); cmrRepositoryManager.addCmrRepositoryChangeListener(this); inputList = new ConcurrentHashMap<>(); for (CmrRepositoryDefinition cmrRepositoryDefinition : cmrRepositoryManager.getCmrRepositoryDefinitions()) { inputList.put(cmrRepositoryDefinition, cmrRepositoryDefinition.getOnlineStatus()); } noDefaultAndApplyButton(); } /** * {@inheritDoc} */ @Override protected Control createContents(Composite parent) { Composite mainComposite = new Composite(parent, SWT.INHERIT_DEFAULT); GridLayout layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; mainComposite.setLayout(layout); Label info = new Label(mainComposite, SWT.NONE); info.setText("Add, remove and manage repositories"); GridData labelGridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false); labelGridData.horizontalSpan = 2; info.setLayoutData(labelGridData); Table table = new Table(mainComposite, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); table.setHeaderVisible(true); table.setLinesVisible(true); tableViewer = new TableViewer(table); createColumns(); tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setInput(inputList.keySet()); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateButtonsState(); } }); Composite buttonComposite = new Composite(mainComposite, SWT.INHERIT_DEFAULT); GridLayout buttonLayout = new GridLayout(1, true); buttonLayout.marginHeight = 0; buttonLayout.marginWidth = 0; buttonComposite.setLayout(buttonLayout); buttonComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); addButton = new Button(buttonComposite, SWT.PUSH); addButton.setText("Add"); addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { AddCmrRepositoryDefinitionDialog dialog = new AddCmrRepositoryDefinitionDialog(getShell()); dialog.open(); if ((dialog.getReturnCode() == Window.OK) && (null != dialog.getCmrRepositoryDefinition())) { inputList.put(dialog.getCmrRepositoryDefinition(), OnlineStatus.OFFLINE); cmrRepositoryManager.forceCmrRepositoryOnlineStatusUpdate(dialog.getCmrRepositoryDefinition()); tableViewer.refresh(); } } }); removeButton = new Button(buttonComposite, SWT.PUSH); removeButton.setText("Remove"); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); removeButton.setEnabled(false); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection selection = (StructuredSelection) tableViewer.getSelection(); for (Object selectedObject : selection.toArray()) { if (selectedObject instanceof CmrRepositoryDefinition) { inputList.remove(selectedObject); } } tableViewer.refresh(); } }); refreshButton = new Button(buttonComposite, SWT.PUSH); refreshButton.setText("Refresh"); refreshButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); refreshButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { for (CmrRepositoryDefinition cmrRepositoryDefinition : inputList.keySet()) { cmrRepositoryManager.forceCmrRepositoryOnlineStatusUpdate(cmrRepositoryDefinition); } } }); manageLabelsButton = new Button(buttonComposite, SWT.PUSH); manageLabelsButton.setText("Manage Labels"); manageLabelsButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); manageLabelsButton.setEnabled(false); manageLabelsButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { StructuredSelection selection = (StructuredSelection) tableViewer.getSelection(); for (Object selectedObject : selection.toArray()) { if (selectedObject instanceof CmrRepositoryDefinition) { ManageLabelWizard mlw = new ManageLabelWizard((CmrRepositoryDefinition) selectedObject); WizardDialog wizardDialog = new WizardDialog(getShell(), mlw); wizardDialog.open(); } } } }); return mainComposite; } /** * {@inheritDoc} */ @Override public boolean performOk() { saveChanges(); return super.performOk(); } @Override public void dispose() { super.dispose(); cmrRepositoryManager.removeCmrRepositoryChangeListener(this); } /** * {@inheritDoc} * <p> * Does nothing. */ @Override public void repositoryAdded(CmrRepositoryDefinition repositoryDefinition) { } /** * {@inheritDoc} * <p> * Does nothing. */ @Override public void repositoryRemoved(CmrRepositoryDefinition repositoryDefinition) { } /** * {@inheritDoc} */ @Override public void repositoryOnlineStatusUpdated(final CmrRepositoryDefinition repositoryDefinition, OnlineStatus oldStatus, OnlineStatus newStatus) { if ((newStatus != OnlineStatus.CHECKING) && inputList.containsKey(repositoryDefinition)) { OnlineStatus oldRegisteredStatus = inputList.get(repositoryDefinition); if (!oldRegisteredStatus.equals(newStatus)) { SafeExecutor.asyncExec(new Runnable() { @Override public void run() { tableViewer.refresh(repositoryDefinition); updateButtonsState(); } }, tableViewer.getTable(), removeButton, manageLabelsButton); inputList.put(repositoryDefinition, newStatus); } } } /** * {@inheritDoc} */ @Override public void repositoryDataUpdated(final CmrRepositoryDefinition cmrRepositoryDefinition) { SafeExecutor.asyncExec(new Runnable() { @Override public void run() { tableViewer.refresh(cmrRepositoryDefinition); } }, tableViewer.getTable()); } /** * {@inheritDoc} */ @Override public void repositoryAgentDeleted(CmrRepositoryDefinition cmrRepositoryDefinition, PlatformIdent agent) { } /** * Updates the state of the remove and license info buttons depending on the current table * selection. */ private void updateButtonsState() { StructuredSelection structuredSelection = (StructuredSelection) tableViewer.getSelection(); if (structuredSelection.isEmpty()) { removeButton.setEnabled(false); manageLabelsButton.setEnabled(false); } else { removeButton.setEnabled(true); if ((structuredSelection.size() == 1) && (((CmrRepositoryDefinition) structuredSelection.getFirstElement()).getOnlineStatus() == OnlineStatus.ONLINE)) { manageLabelsButton.setEnabled(true); } else { manageLabelsButton.setEnabled(false); } } } /** * Save made changes. */ private void saveChanges() { // do nothing if no changes are there if (!isDirty()) { return; } // add all new for (CmrRepositoryDefinition cmrRepositoryDefinition : inputList.keySet()) { if (!cmrRepositoryManager.getCmrRepositoryDefinitions().contains(cmrRepositoryDefinition)) { cmrRepositoryManager.addCmrRepositoryDefinition(cmrRepositoryDefinition); } } // remove all deleted List<CmrRepositoryDefinition> removeList = new ArrayList<>(); for (CmrRepositoryDefinition cmrRepositoryDefinition : cmrRepositoryManager.getCmrRepositoryDefinitions()) { if (!inputList.keySet().contains(cmrRepositoryDefinition)) { removeList.add(cmrRepositoryDefinition); } } if (!removeList.isEmpty()) { for (CmrRepositoryDefinition cmrRepositoryDefinition : removeList) { cmrRepositoryManager.removeCmrRepositoryDefinition(cmrRepositoryDefinition); } } // save to local preferences savePreferences(); } /** * Where there changes performed by user. * * @return Where there changes performed by user. */ private boolean isDirty() { return !Objects.equals(inputList.keySet(), cmrRepositoryManager.getCmrRepositoryDefinitions()); } /** * Saves the changes to preference store. */ private void savePreferences() { PreferencesUtils.saveCmrRepositoryDefinitions(cmrRepositoryManager.getCmrRepositoryDefinitions(), false); } /** * Creates columns for the table. */ private void createColumns() { TableViewerColumn onlineColumn = new TableViewerColumn(tableViewer, SWT.NONE); onlineColumn.getColumn().setResizable(false); onlineColumn.getColumn().setWidth(24); onlineColumn.setLabelProvider(new ColumnLabelProvider() { @Override public Image getImage(Object element) { if (element instanceof CmrRepositoryDefinition) { if (((CmrRepositoryDefinition) element).getOnlineStatus() == OnlineStatus.ONLINE) { return InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_ONLINE_SMALL); } else if (((CmrRepositoryDefinition) element).getOnlineStatus() == OnlineStatus.OFFLINE) { return InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_OFFLINE_SMALL); } else { return InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_REFRESH_SMALL); } } return null; } @Override public String getText(Object element) { return null; } }); TableViewerColumn nameColumn = new TableViewerColumn(tableViewer, SWT.NONE); nameColumn.getColumn().setResizable(true); nameColumn.getColumn().setWidth(150); nameColumn.getColumn().setText("Name"); nameColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CmrRepositoryDefinition) { return ((CmrRepositoryDefinition) element).getName(); } return null; } }); TableViewerColumn ipColumn = new TableViewerColumn(tableViewer, SWT.NONE); ipColumn.getColumn().setResizable(true); ipColumn.getColumn().setWidth(120); ipColumn.getColumn().setText("IP Address"); ipColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CmrRepositoryDefinition) { return ((CmrRepositoryDefinition) element).getIp(); } return null; } }); TableViewerColumn portColumn = new TableViewerColumn(tableViewer, SWT.NONE); portColumn.getColumn().setResizable(true); portColumn.getColumn().setWidth(50); portColumn.getColumn().setText("Port"); portColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof CmrRepositoryDefinition) { return String.valueOf(((CmrRepositoryDefinition) element).getPort()); } return null; } }); } }