Java tutorial
/******************************************************************************* * Copyright (c) May 9, 2011 NetXForge. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> * * Contributors: * Christophe Bouhier - initial API and implementation and/or initial documentation *******************************************************************************/ package com.netxforge.netxstudio.screens.f1; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.set.IObservableSet; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.IEMFListProperty; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.wb.swt.ResourceManager; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.netxforge.base.NonModelUtils; import com.netxforge.netxstudio.common.model.StudioUtils; import com.netxforge.netxstudio.data.actions.ServerRequest; import com.netxforge.netxstudio.generics.GenericsPackage; import com.netxforge.netxstudio.operators.Operator; import com.netxforge.netxstudio.operators.OperatorsPackage; import com.netxforge.netxstudio.scheduling.Job; import com.netxforge.netxstudio.scheduling.JobState; import com.netxforge.netxstudio.scheduling.RFSServiceMonitoringJob; import com.netxforge.netxstudio.scheduling.SchedulingFactory; import com.netxforge.netxstudio.scheduling.SchedulingPackage; import com.netxforge.netxstudio.screens.AbstractScreen; import com.netxforge.netxstudio.screens.dialog.OperatorFilterDialog; import com.netxforge.netxstudio.screens.editing.tables.CDOElementComparer; import com.netxforge.netxstudio.screens.f1.details.NewEditServiceTree; import com.netxforge.netxstudio.screens.f1.support.RFSServiceTreeFactoryImpl; import com.netxforge.netxstudio.screens.f1.support.RFSServiceTreeLabelProvider; import com.netxforge.netxstudio.screens.f1.support.RFSServiceTreeStructureAdvisorImpl; import com.netxforge.netxstudio.screens.f1.support.ScheduledReportSelectionWizard; import com.netxforge.netxstudio.screens.f4.NewEditJob; import com.netxforge.netxstudio.screens.f4.ServiceMonitors; import com.netxforge.netxstudio.services.RFSService; import com.netxforge.netxstudio.services.Service; import com.netxforge.netxstudio.services.ServicesFactory; import com.netxforge.netxstudio.services.ServicesPackage; import com.netxforge.screens.editing.base.IDataServiceInjection; import com.netxforge.screens.editing.base.IScreen; import com.netxforge.screens.editing.base.ScreenUtil; import com.netxforge.screens.editing.base.WizardUtil; import com.netxforge.screens.editing.base.actions.SeparatorAction; import com.netxforge.screens.editing.base.filter.TreeSearchFilter; /** * @author Christophe Bouhier christophe.bouhier@netxforge.com * */ public class ServicesTree extends AbstractScreen implements IDataServiceInjection { private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Text txtFilterText; @SuppressWarnings("unused") private DataBindingContext bindingContext; private Form frmServices; private TreeViewer serviceTreeViewer; private Composite cmpDetails; private SashForm sashForm; private Resource operatorsResource; @Inject ServerRequest serverActions; /** * Create the composite. * * @param parent * @param style */ public ServicesTree(Composite parent, int style) { super(parent, style); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { // obm.dispose(); toolkit.dispose(); } }); toolkit.adapt(this); toolkit.paintBordersFor(this); } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData() */ public void injectData() { operatorsResource = editingService.getData(OperatorsPackage.Literals.OPERATOR); // rfsServiceResource = editingService // .getData(ServicesPackage.Literals.RFS_SERVICE); buildUI(); initDataBindings_(); } Thread updateDetails; private void buildUI() { setLayout(new FillLayout(SWT.HORIZONTAL)); // Readonlyness. boolean readonly = ScreenUtil.isReadOnlyOperation(this.getOperation()); int widgetStyle = readonly ? SWT.READ_ONLY : SWT.NONE; frmServices = toolkit.createForm(this); frmServices.setSeparatorVisible(true); toolkit.paintBordersFor(frmServices); frmServices.setText(this.getOperationText() + "Services"); frmServices.getBody().setLayout(new FillLayout(SWT.HORIZONTAL)); sashForm = new SashForm(frmServices.getBody(), SWT.VERTICAL); sashForm.setOrientation(SWT.HORIZONTAL); toolkit.adapt(sashForm); toolkit.paintBordersFor(sashForm); Composite composite = toolkit.createComposite(sashForm, SWT.NONE); toolkit.paintBordersFor(composite); composite.setLayout(new GridLayout(3, false)); Label lblFilterLabel = toolkit.createLabel(composite, "Filter:", SWT.NONE); lblFilterLabel.setSize(64, 81); txtFilterText = toolkit.createText(composite, "New Text", SWT.H_SCROLL | SWT.SEARCH | SWT.CANCEL); GridData gd_txtFilterText = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); // gd_txtFilterText.widthHint = 200; txtFilterText.setLayoutData(gd_txtFilterText); txtFilterText.setSize(64, 81); txtFilterText.setText(""); txtFilterText.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent ke) { serviceTreeViewer.refresh(); ViewerFilter[] filters = serviceTreeViewer.getFilters(); for (ViewerFilter viewerFilter : filters) { if (viewerFilter instanceof TreeSearchFilter) { ((TreeSearchFilter) viewerFilter).setSearchText(txtFilterText.getText()); } } } }); if (!readonly) { hypLnkNewRFSService = toolkit.createImageHyperlink(composite, SWT.NONE); hypLnkNewRFSService.setImage(ResourceManager.getPluginImage("com.netxforge.netxstudio.models.edit", "icons/full/ctool16/Service_E.png")); hypLnkNewRFSService.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { OperatorFilterDialog dialog = new OperatorFilterDialog(ServicesTree.this.getShell(), operatorsResource); int result = dialog.open(); if (result == Window.OK) { Operator operator = (Operator) dialog.getFirstResult(); // Create a new top level nodetype. RFSService newRFSService = ServicesFactory.eINSTANCE.createRFSService(); newRFSService.setServiceName("<new Resource Facing Service>"); Command add = new AddCommand(editingService.getEditingDomain(), operator.getServices(), newRFSService); editingService.getEditingDomain().getCommandStack().execute(add); } } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } }); hypLnkNewRFSService.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); toolkit.paintBordersFor(hypLnkNewRFSService); hypLnkNewRFSService.setText("New"); } serviceTreeViewer = new TreeViewer(composite, SWT.BORDER | SWT.MULTI | SWT.VIRTUAL | widgetStyle); serviceTreeViewer.setUseHashlookup(true); serviceTreeViewer.setComparer(new CDOElementComparer()); serviceTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { final ISelection s = event.getSelection(); final Object o; if (s instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) s; o = ss.getFirstElement(); } else { o = null; } ServicesTree.this.getDisplay().asyncExec(new Runnable() { public void run() { try { handleDetailsSelection(o); } catch (Exception e) { e.printStackTrace(); } } }); } }); Tree tree = serviceTreeViewer.getTree(); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 2)); tree.setSize(74, 81); toolkit.paintBordersFor(tree); serviceTreeViewer.addFilter(new TreeSearchFilter()); cmpDetails = toolkit.createComposite(sashForm, SWT.NONE); toolkit.paintBordersFor(cmpDetails); cmpDetails.setLayout(new FillLayout()); sashForm.setWeights(new int[] { 3, 7 }); } /** * @author Christophe Bouhier */ class ExportHTMLAction extends Action { public ExportHTMLAction(String text) { super(text); } @Override public void run() { ISelection s = serviceTreeViewer.getSelection(); if (s instanceof IStructuredSelection) { // TODO Migrate. // WizardUtil // .openWizard( // "com.netxforge.netxstudio.models.export.wizard.ui.nodetype.html", // (IStructuredSelection) s); } } } /** * @author Christophe Bouhier */ class ExportXLSAction extends Action { public ExportXLSAction(String text, int style) { super(text, style); } @Override public void run() { ISelection s = serviceTreeViewer.getSelection(); if (s instanceof IStructuredSelection) { // TODO Migrate // WizardUtil // .openWizard( // "com.netxforge.netxstudio.models.export.wizard.ui.nodetype.xls", // (IStructuredSelection) s); } } } private final List<IAction> actions = Lists.newArrayList(); @Override public IAction[] getActions() { if (actions.isEmpty()) { boolean readonly = ScreenUtil.isReadOnlyOperation(getOperation()); // actions.add(new ExportHTMLAction("Export to HTML", SWT.PUSH)); // actions.add(new ExportXLSAction("Export to XLS", SWT.PUSH)); // actions.add(new SeparatorAction()); if (!readonly) { actions.add(new ScheduleMonitorJobAction("Schedule Monitoring Job...")); actions.add(new MonitorNowAction("Monitor Now...")); } actions.add(new ServiceMonitoringAction("Monitoring Result...")); actions.add(new SeparatorAction()); actions.add(new SeparatorAction()); if (!readonly) { actions.add(new ScheduleReportingJobAction("Schedule Reporting Job...")); } actions.add(new ReportNowAction("Report Now...")); actions.add(new SeparatorAction()); } return actions.toArray(new IAction[actions.size()]); } public void disposeData() { // N/A } public EMFDataBindingContext initDataBindings_() { EMFDataBindingContext bindingContext = new EMFDataBindingContext(); ObservableListTreeContentProvider cp = new ObservableListTreeContentProvider( new RFSServiceTreeFactoryImpl(editingService.getEditingDomain()), new RFSServiceTreeStructureAdvisorImpl()); serviceTreeViewer.setContentProvider(cp); IObservableSet set = cp.getKnownElements(); List<IObservableMap> mapList = Lists.newArrayList(); mapList.add( EMFEditProperties.value(editingService.getEditingDomain(), GenericsPackage.Literals.COMPANY__NAME) .observeDetail(set)); mapList.add(EMFEditProperties .value(editingService.getEditingDomain(), ServicesPackage.Literals.SERVICE__SERVICE_NAME) .observeDetail(set)); mapList.add(EMFProperties.value(ServicesPackage.Literals.RFS_SERVICE__NODES).observeDetail(set)); IObservableMap[] map = new IObservableMap[mapList.size()]; mapList.toArray(map); serviceTreeViewer.setLabelProvider(new RFSServiceTreeLabelProvider(map)); IEMFListProperty projects = EMFEditProperties.resource(editingService.getEditingDomain()); IObservableList servicesObservableList = projects.observe(operatorsResource); serviceTreeViewer.setInput(servicesObservableList); return bindingContext; } Composite currentDetails; private ImageHyperlink hypLnkNewRFSService; private void handleDetailsSelection(Object o) { if (currentDetails != null) { currentDetails.dispose(); } if (o instanceof RFSService) { NewEditServiceTree screen = null; screen = new NewEditServiceTree(this.cmpDetails, SWT.NONE, editingService); screen.setParentScreen(this); screen.setScreenService(screenService); screen.setOperation(getOperation()); screen.injectData(null, o); this.currentDetails = screen; sashForm.layout(true, true); } } /* * (non-Javadoc) * * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer() */ public Viewer getViewer() { if (currentDetails != null) { if (currentDetails instanceof IScreen) { Viewer v = ((IScreen) currentDetails).getViewer(); if (v != null) { return v; } } } return serviceTreeViewer; } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid() */ public boolean isValid() { return true; } public Form getScreenForm() { return this.frmServices; } /** * Wrap in an action, to contribute to a menu manager. * * @author Christophe Bouhier * */ class ServiceMonitoringAction extends Action { public ServiceMonitoringAction(String text) { super(text); } @Override public void run() { super.run(); if (screenService != null) { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { Object o = ((IStructuredSelection) selection).getFirstElement(); ServiceMonitors smScreen = new ServiceMonitors(screenService.getScreenContainer(), SWT.NONE); // CB 09-04-2012 Will prevent delete! // smScreen.setOperation(ScreenUtil.OPERATION_READ_ONLY); smScreen.setOperation(ScreenUtil.OPERATION_EDIT); smScreen.setScreenService(screenService); smScreen.injectData(null, o); screenService.setActiveScreen(smScreen); } } } } class MonitorNowAction extends Action { public MonitorNowAction(String text) { super(text); } @Override public void run() { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { WizardUtil.openWizard("com.netxforge.netxstudio.screens.monitoring", (IStructuredSelection) selection); } } } class ReportNowAction extends Action { public ReportNowAction(String text) { super(text); } @Override public void run() { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { WizardUtil.openWizard("com.netxforge.netxstudio.screens.reporting", (IStructuredSelection) selection); } } } class ShowDistributionAction extends Action { public ShowDistributionAction(String text, int style) { super(text, style); } @Override public void run() { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { Object o = ((IStructuredSelection) selection).getFirstElement(); if (o instanceof Service) { @SuppressWarnings("unused") Service service = (Service) o; // Show service distribution. } } } } class ScheduleMonitorJobAction extends Action { public ScheduleMonitorJobAction(String text) { super(text); } @Override public void run() { if (screenService != null) { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { Object o = ((IStructuredSelection) selection).getFirstElement(); if (o instanceof Service) { int operation = -1; Resource jobResource = editingService.getData(SchedulingPackage.Literals.JOB); Job job = StudioUtils.jobForSingleObject(jobResource, SchedulingPackage.Literals.RFS_SERVICE_MONITORING_JOB, SchedulingPackage.Literals.RFS_SERVICE_MONITORING_JOB__RFS_SERVICE, (Service) o); // List<Job> matchingJobs = editingService // .getDataService().getQueryService() // .getJobWithService((Service) o); // Edit or New if the Service has a job or not. if (job != null) { operation = ScreenUtil.OPERATION_EDIT; } else { operation = ScreenUtil.OPERATION_NEW; job = SchedulingFactory.eINSTANCE.createRFSServiceMonitoringJob(); job.setName(((Service) o).getServiceName()); job.setInterval(NonModelUtils.SECONDS_IN_A_WEEK); job.setStartTime(NonModelUtils.toXMLDate(NonModelUtils.todayAndNow())); job.setJobState(JobState.IN_ACTIVE); if (job instanceof RFSServiceMonitoringJob) { ((RFSServiceMonitoringJob) job).setRFSService((RFSService) o); } } NewEditJob newEditJob = new NewEditJob(screenService.getScreenContainer(), SWT.NONE); newEditJob.setOperation(operation); newEditJob.setScreenService(screenService); newEditJob.injectData(jobResource, job); screenService.setActiveScreen(newEditJob); } } } } } class ScheduleReportingJobAction extends Action { public ScheduleReportingJobAction(String text) { super(text); } @Override public void run() { ISelection selection = getViewer().getSelection(); Resource jobResource = editingService.getData(SchedulingPackage.Literals.JOB); ScheduledReportSelectionWizard wizard = new ScheduledReportSelectionWizard(); wizard.init(PlatformUI.getWorkbench(), (IStructuredSelection) selection); wizard.setEditingService(editingService); WizardDialog dialog = new WizardDialog(ServicesTree.this.getShell(), wizard); dialog.open(); Job job = wizard.getJob(); NewEditJob newEditJob = new NewEditJob(screenService.getScreenContainer(), SWT.NONE); newEditJob.setOperation(wizard.getOperation()); newEditJob.setScreenService(screenService); newEditJob.injectData(jobResource, job); screenService.setActiveScreen(newEditJob); } } @Override public String getScreenName() { return "Services"; } }