Java tutorial
/******************************************************************************* * Copyright (c) Jun 25, 2011 NetXForge. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU 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 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.f4; import java.util.List; 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.cdo.eresource.CDOResource; 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.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.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; 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.swt.widgets.TreeColumn; import org.eclipse.ui.IMemento; 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.Iterables; import com.google.common.collect.Lists; import com.netxforge.base.NonModelUtils; import com.netxforge.netxstudio.common.model.StudioUtils; import com.netxforge.netxstudio.generics.DateTimeRange; import com.netxforge.netxstudio.generics.GenericsFactory; import com.netxforge.netxstudio.generics.Value; import com.netxforge.netxstudio.library.NetXResource; import com.netxforge.netxstudio.metrics.Metric; import com.netxforge.netxstudio.metrics.MetricsFactory; import com.netxforge.netxstudio.metrics.MetricsPackage; import com.netxforge.netxstudio.screens.AbstractScreen; import com.netxforge.netxstudio.screens.editing.filter.CDOSearchFilter; import com.netxforge.netxstudio.screens.editing.tables.CDOElementComparer; import com.netxforge.netxstudio.screens.editing.util.CDOMementoUtil; import com.netxforge.netxstudio.screens.f4.support.MetricTreeFactory; import com.netxforge.netxstudio.screens.f4.support.MetricTreeLabelProvider; import com.netxforge.netxstudio.screens.f4.support.MetricTreeStructureAdvisor; import com.netxforge.screens.editing.base.IDataServiceInjection; import com.netxforge.screens.editing.base.ScreenUtil; import com.netxforge.screens.editing.base.filter.ISearchFilter; import com.netxforge.screens.editing.base.util.MementoUtil; public class Metrics extends AbstractScreen implements IDataServiceInjection { private static final String MEM_KEY_METRIC_SELECTION_TABLE = "MEM_KEY_METRIC_SELECTION_TABLE"; private static final String MEM_KEY_METRIC_COLUMNS_TABLE = "MEM_KEY_METRIC_COLUMNS_TABLE"; private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Text txtFilterText; private Resource metricResource; @SuppressWarnings("unused") private EMFDataBindingContext bindingContext; private Form frmMetrics; private TreeViewer metricsTreeViewer; private ObservableListTreeContentProvider listTreeContentProvider; /** * Create the composite. * * @param parent * @param style */ public Metrics(Composite parent, int style) { super(parent, style); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { toolkit.dispose(); } }); toolkit.adapt(this); toolkit.paintBordersFor(this); // this.buildUI(); } public EMFDataBindingContext initDataBindings_() { listTreeContentProvider = new ObservableListTreeContentProvider( new MetricTreeFactory(editingService.getEditingDomain()), new MetricTreeStructureAdvisor()); metricsTreeViewer.setContentProvider(listTreeContentProvider); IObservableSet set = listTreeContentProvider.getKnownElements(); IObservableMap[] map = new IObservableMap[2]; map[0] = EMFProperties.value(MetricsPackage.Literals.METRIC__NAME).observeDetail(set); map[1] = EMFProperties.value(MetricsPackage.Literals.METRIC__DESCRIPTION).observeDetail(set); metricsTreeViewer.setLabelProvider(new MetricTreeLabelProvider(map)); IEMFListProperty metricsProperty = EMFEditProperties.resource(editingService.getEditingDomain()); IObservableList metricsObservableList = metricsProperty.observe(metricResource); metricsTreeViewer.setInput(metricsObservableList); EMFDataBindingContext context = new EMFDataBindingContext(); return context; } public void injectData() { metricResource = editingService.getData(MetricsPackage.Literals.METRIC); buildUI(); bindingContext = initDataBindings_(); } private void buildUI() { // Readonlyness. boolean readonly = ScreenUtil.isReadOnlyOperation(this.getOperation()); String actionText = readonly ? "View: " : "Edit: "; setLayout(new FillLayout(SWT.HORIZONTAL)); frmMetrics = toolkit.createForm(this); frmMetrics.setSeparatorVisible(true); toolkit.paintBordersFor(frmMetrics); frmMetrics.setText(actionText + "Metrics"); frmMetrics.getBody().setLayout(new GridLayout(3, false)); Label lblFilterLabel = toolkit.createLabel(frmMetrics.getBody(), "Filter:", SWT.NONE); lblFilterLabel.setAlignment(SWT.RIGHT); GridData gd_lblFilterLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_lblFilterLabel.widthHint = 36; lblFilterLabel.setLayoutData(gd_lblFilterLabel); txtFilterText = toolkit.createText(frmMetrics.getBody(), "New Text", SWT.H_SCROLL | SWT.SEARCH | SWT.CANCEL); txtFilterText.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent ke) { ViewerFilter[] filters = metricsTreeViewer.getFilters(); for (ViewerFilter viewerFilter : filters) { if (viewerFilter instanceof ISearchFilter) { ((ISearchFilter) viewerFilter).setSearchText(txtFilterText.getText()); } } metricsTreeViewer.refresh(); } }); txtFilterText.setText(""); GridData gd_txtFilterText = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1); gd_txtFilterText.widthHint = 200; txtFilterText.setLayoutData(gd_txtFilterText); if (!readonly) { ImageHyperlink mghprlnkNewMetric = toolkit.createImageHyperlink(frmMetrics.getBody(), SWT.NONE); mghprlnkNewMetric.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { if (screenService != null) { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { Object subowner = ((IStructuredSelection) selection).getFirstElement(); NewEditMetric metricScreen = new NewEditMetric(screenService.getScreenContainer(), SWT.NONE); metricScreen.setOperation(ScreenUtil.OPERATION_NEW); metricScreen.setScreenService(screenService); Metric metric = MetricsFactory.eINSTANCE.createMetric(); // metricScreen.injectData(metricResource, metric); metricScreen.injectData(metricResource, subowner, metric); screenService.setActiveScreen(metricScreen); } } } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } }); mghprlnkNewMetric.setImage(ResourceManager.getPluginImage("com.netxforge.netxstudio.models.edit", "icons/full/ctool16/Metric_E.png")); toolkit.paintBordersFor(mghprlnkNewMetric); mghprlnkNewMetric.setText("New"); } metricsTreeViewer = new TreeViewer(frmMetrics.getBody(), SWT.BORDER | SWT.VIRTUAL | SWT.MULTI | SWT.FULL_SELECTION); metricsTreeViewer.setUseHashlookup(true); metricsTreeViewer.setComparer(new CDOElementComparer()); Tree tree = metricsTreeViewer.getTree(); tree.setLinesVisible(true); tree.setHeaderVisible(true); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); toolkit.paintBordersFor(tree); TreeViewerColumn treeViewerColumn = new TreeViewerColumn(metricsTreeViewer, SWT.NONE); TreeColumn trclmnName = treeViewerColumn.getColumn(); trclmnName.setWidth(300); trclmnName.setText("Name"); TreeViewerColumn treeViewerColumn_1 = new TreeViewerColumn(metricsTreeViewer, SWT.NONE); TreeColumn trclmnDescription = treeViewerColumn_1.getColumn(); trclmnDescription.setWidth(270); trclmnDescription.setText("Description"); TreeViewerColumn treeViewerColumn_2 = new TreeViewerColumn(metricsTreeViewer, SWT.NONE); TreeColumn trclmnUnit = treeViewerColumn_2.getColumn(); trclmnUnit.setWidth(84); trclmnUnit.setText("Unit"); metricsTreeViewer.addFilter(new CDOSearchFilter()); } /** * Wrap in an action, to contribute to a menu manager. * * @author Christophe Bouhier * */ class EditMetricAction extends Action { public EditMetricAction(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(); NewEditMetric metricScreen = new NewEditMetric(screenService.getScreenContainer(), SWT.NONE); metricScreen.setScreenService(screenService); metricScreen.setOperation(getOperation()); Object subowner = null; if (o instanceof Metric) { if (((Metric) o).eContainer() instanceof Metric) { subowner = ((Metric) o).eContainer(); } } metricScreen.injectData(metricResource, subowner, o); screenService.setActiveScreen(metricScreen); } } } } /** * Wrap in an action, to contribute to a menu manager. * * @author Christophe Bouhier * */ class ValuesForMetricAction extends Action { public ValuesForMetricAction(String text) { super(text); } @SuppressWarnings("unchecked") @Override public void run() { super.run(); if (screenService != null) { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { List<Metric> metrics = Lists.newArrayList(((IStructuredSelection) selection).iterator()); List<NetXResource> resources = StudioUtils.resourcesForMetrics(metrics); // TODO, Invoke a dialog to select a DTR and Interval. DateTimeRange dtr = GenericsFactory.eINSTANCE.createDateTimeRange(); int targetIntervalHint = NonModelUtils.MINUTES_IN_AN_HOUR; System.out.println("VALUES FOR PERIOD:"); System.out.println("FROM=" + NonModelUtils.dateAndTime(dtr.getBegin())); System.out.println("TO=" + NonModelUtils.dateAndTime(dtr.getEnd())); int valueCount = 0; for (NetXResource res : resources) { System.out.println("values for resource: " + res.getShortName() + "on Component" + res.getComponentRef().getName()); List<Value> values = StudioUtils.valuesForIntervalKindAndPeriod(res, targetIntervalHint, null, dtr); if (values.size() > 0) { valueCount += values.size(); System.out.println("number of values " + Iterables.size(values)); for (Value v : values) { System.out .println(NonModelUtils.fromXMLDate(v.getTimeStamp()) + ":" + v.getValue()); } } } System.out.println("total values for this import = " + valueCount); } } } } /** * Wrap in an action, to contribute to a menu manager. * * @author Christophe Bouhier * */ class NewMetricAction extends Action { public NewMetricAction(String text) { super(text); } @Override public void run() { super.run(); if (screenService != null) { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { Object subowner = ((IStructuredSelection) selection).getFirstElement(); NewEditMetric metricScreen = new NewEditMetric(screenService.getScreenContainer(), SWT.NONE); metricScreen.setOperation(ScreenUtil.OPERATION_NEW); metricScreen.setScreenService(screenService); Metric metric = MetricsFactory.eINSTANCE.createMetric(); metricScreen.injectData(metricResource, subowner, metric); screenService.setActiveScreen(metricScreen); } } } } public Viewer getViewer() { return metricsTreeViewer; } @Override public boolean isValid() { return false; } public Form getScreenForm() { return this.frmMetrics; } private final List<IAction> actions = Lists.newArrayList(); @Override public IAction[] getActions() { // lazy init actions. if (actions.isEmpty()) { String actionText = ScreenUtil.isReadOnlyOperation(getOperation()) ? "View" : "Edit"; actions.add(new EditMetricAction(actionText + "...")); // if(!Screens.isReadOnlyOperation(getOperation())){ // actions.add(new NewMetricAction("New...", // SWT.PUSH)); // } } return actions.toArray(new IAction[actions.size()]); } @Override public String getScreenName() { return "Metrics"; } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.AbstractScreenImpl#saveState(org.eclipse * .ui.IMemento) */ @Override public void saveState(IMemento memento) { // sash state vertical. CDOMementoUtil.rememberStructuredViewerSelection(memento, metricsTreeViewer, MEM_KEY_METRIC_SELECTION_TABLE); MementoUtil.rememberStructuredViewerColumns(memento, metricsTreeViewer, MEM_KEY_METRIC_COLUMNS_TABLE); } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.AbstractScreenImpl#init(org.eclipse. * ui.IMemento) */ @Override public void restoreState(IMemento memento) { if (memento != null) { CDOMementoUtil.retrieveStructuredViewerSelection(memento, metricsTreeViewer, MEM_KEY_METRIC_SELECTION_TABLE, ((CDOResource) metricResource).cdoView()); MementoUtil.retrieveStructuredViewerColumns(memento, metricsTreeViewer, MEM_KEY_METRIC_COLUMNS_TABLE); } } }