Java tutorial
/******************************************************************************* * Copyright (c) 2009, 2014 Xored Software Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Xored Software Inc - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.rcptt.ui.resources.viewers; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.databinding.EMFObservables; import org.eclipse.emf.ecore.util.EContentAdapter; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerEditor; import org.eclipse.rcptt.core.model.IQ7NamedElement; import org.eclipse.rcptt.core.model.ModelException; import org.eclipse.rcptt.core.persistence.IPersistenceModel; import org.eclipse.rcptt.core.persistence.PersistenceManager; import org.eclipse.rcptt.core.scenario.Context; import org.eclipse.rcptt.core.workspace.Q7Utils; import org.eclipse.rcptt.ctx.resources.ImportUtils; import org.eclipse.rcptt.ctx.resources.WSUtils; import org.eclipse.rcptt.ctx.resources.WorkspaceContextImporter; import org.eclipse.rcptt.internal.ui.Q7UIPlugin; import org.eclipse.rcptt.ui.context.BaseContextEditor; import org.eclipse.rcptt.ui.controls.SectionWithComposite; import org.eclipse.rcptt.ui.editors.EditorHeader; import org.eclipse.rcptt.ui.resources.actions.WSAction; import org.eclipse.rcptt.ui.utils.DefaultTreeViewerEditStrategy; import org.eclipse.rcptt.ui.utils.UIContentAdapter; import org.eclipse.rcptt.workspace.WSContainer; import org.eclipse.rcptt.workspace.WSFile; import org.eclipse.rcptt.workspace.WSFileLink; import org.eclipse.rcptt.workspace.WSFolder; import org.eclipse.rcptt.workspace.WSProject; import org.eclipse.rcptt.workspace.WSProjectLink; import org.eclipse.rcptt.workspace.WSResource; import org.eclipse.rcptt.workspace.WSRoot; import org.eclipse.rcptt.workspace.WorkspaceContext; import org.eclipse.rcptt.workspace.WorkspacePackage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.RowLayout; 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.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; public class WorkspaceContextEditor extends BaseContextEditor { private boolean corrected = false; private Text ignoreByClearPattern; private Label ignoreByClearPatternLabel; public WorkspaceContext getContextElement() { try { return (WorkspaceContext) super.getElement().getNamedElement(); } catch (ModelException e) { Q7UIPlugin.log(e); } return null; } private static IFolder getFolder(IFile file) { return getFolder(file, ""); } private static IFolder getFolder(IFile file, String postfix) { String folderName = file.getName().replaceAll("\\.", ""); return file.getParent().getFolder(new Path("." + folderName + postfix)); } private IResource[] getRelativeResources(Context context, IFile iFile) { IFile file = null; if (iFile == null) { file = Q7Utils.getLocation(context); } else { file = iFile; } if (file != null) { List<IResource> result = new ArrayList<IResource>(); IFolder folder = getFolder(file); if (folder.exists()) { result.add(folder); } folder = getFolder(file, "wc"); if (folder.exists()) { result.add(folder); } return result.toArray(new IResource[result.size()]); } return new IFolder[0]; } public void setElement(IQ7NamedElement context) { super.setElement(context); corrected = false; // Convert previous scenario to new one format IResource[] resources = getRelativeResources(getContextElement(), null); if (resources != null && resources.length > 0) { IPersistenceModel model = PersistenceManager.getInstance().getModel(getContextElement().eResource()); // if (model.getNames().length == 0) { // Convert resources to new format WorkspaceContextImporter importer = new WorkspaceContextImporter(getContextElement()); EList<WSProject> projects = getContextElement().getContent().getProjects(); for (WSProject wsProject : projects) { WSProject ownProject = WSUtils.getProject(getContextElement().getContent(), wsProject.getName(), true); ImportUtils.importFiles(ownProject, wsProject.getFiles(), model, importer); ImportUtils.importFolders(ownProject, wsProject.getFolders(), model, importer); } corrected = true; // Make it dirty // context.setName(getContextElement().getName()); // } } } public void save() throws CoreException { if (corrected) { IResource[] resources = getRelativeResources(getContextElement(), null); if (resources != null && resources.length > 0) { // Remove old resources, since we already corrected context for (IResource iResource : resources) { if (iResource.exists()) { iResource.delete(true, new NullProgressMonitor()); } } } } super.save(); } public Control create(Composite parent, FormToolkit toolkit, IWorkbenchSite site, EditorHeader header) { Section section = toolkit.createSection(parent, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED | Section.NO_TITLE_FOCUS_BOX); section.setText("Workspace Options"); GridDataFactory.fillDefaults().grab(true, false).applyTo(section); Composite optionsComposite = toolkit.createComposite(section); GridLayoutFactory.fillDefaults().extendedMargins(0, 0, 0, 5).numColumns(1).applyTo(optionsComposite); section.setClient(optionsComposite); createOptionsControls(optionsComposite, toolkit); Section wsSection = new SectionWithComposite("Workspace", Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED).numColumns(2).create(parent, toolkit); Composite wsComposite = (Composite) wsSection.getClient(); createTree(wsComposite, toolkit); createPanel(wsComposite, toolkit); return section; } private void createOptionsControls(Composite parent, FormToolkit toolkit) { Button clearWorkspace = toolkit.createButton(parent, "Clear workspace", SWT.CHECK); GridDataFactory.fillDefaults().span(2, 1).applyTo(clearWorkspace); ignoreByClearPatternLabel = new Label(parent, SWT.NONE); ignoreByClearPatternLabel .setText("Do not clear following folders or files (use comma as separator, * = any string):"); ignoreByClearPatternLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); ignoreByClearPatternLabel.setBackground(null); GridDataFactory.fillDefaults().span(2, 1).hint(100, SWT.DEFAULT).applyTo(ignoreByClearPatternLabel); ignoreByClearPattern = toolkit.createText(parent, "", SWT.BORDER); ignoreByClearPattern.setBackground(null); GridDataFactory.fillDefaults().grab(true, false).span(2, 1).hint(100, SWT.DEFAULT) .applyTo(ignoreByClearPattern); dbc.bindValue(SWTObservables.observeSelection(clearWorkspace), EMFObservables.observeValue(getContextElement(), WorkspacePackage.Literals.WORKSPACE_CONTEXT__CLEAR_WORKSPACE), new ClearWorkspaceChangeListener(), new ClearWorkspaceChangeListener()); dbc.bindValue(SWTObservables.observeText(ignoreByClearPattern, SWT.Modify), EMFObservables.observeValue( getContextElement(), WorkspacePackage.Literals.WORKSPACE_CONTEXT__IGNORED_BY_CLEAR_PATTERN)); } private class ClearWorkspaceChangeListener extends UpdateValueStrategy { public IStatus validateBeforeSet(Object value) { Boolean sValue = (Boolean) value; if (ignoreByClearPattern != null) { ignoreByClearPattern.setEnabled(sValue); } if (ignoreByClearPatternLabel != null) { ignoreByClearPatternLabel.setEnabled(sValue); } return super.validateBeforeSet(value); } } private Tree createTree(Composite parent, FormToolkit toolkit) { Tree tree = new Tree(parent, SWT.BORDER | SWT.MULTI); GridDataFactory.fillDefaults().grab(true, true).hint(100, 50).applyTo(tree); viewer = new TreeViewer(tree); TreeViewerEditor.create(viewer, new DefaultTreeViewerEditStrategy(viewer), ColumnViewerEditor.DEFAULT); viewer.setCellEditors(new CellEditor[] { new TextCellEditor(tree) }); viewer.setCellModifier(new ICellModifier() { public void modify(Object element, String property, Object value) { TreeItem item = (TreeItem) element; WSResource res = (WSResource) item.getData(); WSContainer parent = (WSContainer) res.eContainer(); Set<String> allNames = getAllNames(parent); allNames.remove(res.getName()); String newValue = (String) value; if (allNames.contains(newValue)) { return; } if (newValue != null && !newValue.equals(res.getName())) { try { IPersistenceModel model = getElement().getPersistenceModel(); if (res instanceof WSFile) { String oldName = ImportUtils.getName((WSFile) res); res.setName(newValue); String newName = ImportUtils.getName((WSFile) res); model.rename(oldName, newName); } else if (res instanceof WSContainer) { // Rename all stored files. List<String> oldNames = new ArrayList<String>(); List<WSFile> allFiles = findChildFiles((WSContainer) res); for (WSFile wsFile : allFiles) { oldNames.add(ImportUtils.getName(wsFile)); } res.setName(newValue); for (int i = 0; i < oldNames.size(); i++) { String oldName = oldNames.get(i); WSFile file = allFiles.get(i); String newName = ImportUtils.getName(file); model.rename(oldName, newName); } } // viewer.update(res, null); } catch (Exception e) { Q7UIPlugin.log(e); } } } public Object getValue(Object element, String property) { return ((WSResource) element).getName(); } public boolean canModify(Object element, String property) { return true; } }); viewer.setColumnProperties(new String[] { "o" }); viewer.setContentProvider(new WorkspaceContentProvider()); ILabelDecorator decorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(); viewer.setLabelProvider( new DecoratingStyledCellLabelProvider(new WorkspaceLabelProvider(), decorator, null)); viewer.setInput(getContextElement()); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection sel = (IStructuredSelection) viewer.getSelection(); Object[] res = sel.toArray(); WSResource[] resources = new WSResource[res.length]; for (int i = 0; i < res.length; i++) resources[i] = (WSResource) res[i]; setSelection(resources); } }); viewer.addDoubleClickListener(new IDoubleClickListener() { /** * Opens file or expands/collapses folder. */ public void doubleClick(DoubleClickEvent event) { if (openFileAction.isEnabled()) { openFileAction.run(); } else { TreeViewer viewer = (TreeViewer) event.getViewer(); IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Object selectedNode = selection.getFirstElement(); viewer.setExpandedState(selectedNode, !viewer.getExpandedState(selectedNode)); } } }); viewer.getControl().addKeyListener(new KeyListener() { public void keyReleased(KeyEvent e) { } public void keyPressed(KeyEvent e) { if ((SWT.DEL == e.character) && (0 == e.stateMask)) { if (removeAction.isEnabled()) { removeAction.run(); e.doit = false; } } } }); adapter = new UIContentAdapter() { protected void changed(Notification notification) { if (viewer.getControl().isDisposed()) { return; } viewer.refresh(); } }; getContextElement().eAdapters().add(adapter); toolkit.adapt(tree); return tree; } protected List<WSFile> findChildFiles(WSContainer res) { List<WSFile> allFiles = new ArrayList<WSFile>(); if (res instanceof WSFolder) { EList<WSFolder> folders = ((WSFolder) res).getFolders(); allFiles.addAll(((WSFolder) res).getFiles()); for (WSFolder folder : folders) { allFiles.addAll(findChildFiles(folder)); } } return allFiles; } private Composite createPanel(Composite parent, FormToolkit toolkit) { Composite panel = toolkit.createComposite(parent); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo(panel); RowLayout layout = new RowLayout(SWT.VERTICAL); layout.pack = false; layout.marginBottom = 0; layout.marginLeft = 0; layout.marginTop = 0; layout.marginRight = 0; panel.setLayout(layout); createButton(panel, toolkit, new WSAction.AddProject()); createButton(panel, toolkit, new WSAction.AddFolder()); createButton(panel, toolkit, new WSAction.ImportProjects()); createButton(panel, toolkit, new WSAction.ImportFiles()); createButton(panel, toolkit, new WSAction.LinkProject()); createButton(panel, toolkit, new WSAction.LinkFolder()); createButton(panel, toolkit, new WSAction.LinkFiles()); createButton(panel, toolkit, removeAction = new WSAction.Remove()); createButton(panel, toolkit, openFileAction = new WSAction.OpenFile()); createButton(panel, toolkit, new WSAction.Rename()); // createButton(panel, new WSAction.AddFile()); setSelection(null); return panel; } private void createButton(Composite parent, FormToolkit toolkit, final WSAction action) { action.setViewer(viewer); Button button = toolkit.createButton(parent, action.getText(), SWT.PUSH); button.setData(action); Image image = action.getImageDescriptor().createImage(); button.setImage(image); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { action.run(); } }); buttons.add(button); } private void setSelection(WSResource[] selection) { for (Button button : buttons) { WSAction action = (WSAction) button.getData(); action.setSelection(selection); button.setEnabled(action.isEnabled()); } } public boolean isAutoSaveEnabled() { return true; } private Set<String> getAllNames(WSContainer parent) { Set<String> allNames = new HashSet<String>(); if (parent instanceof WSFolder) { EList<WSFolder> folders = ((WSFolder) parent).getFolders(); EList<WSFile> files = ((WSFolder) parent).getFiles(); EList<WSFileLink> fileLinks = ((WSFolder) parent).getFileLinks(); for (WSFileLink link : fileLinks) { allNames.add(link.getName()); } for (WSFile wsFile : files) { allNames.add(wsFile.getName()); } for (WSFolder folder : folders) { allNames.add(folder.getName()); } } else if (parent instanceof WSRoot) { EList<WSProject> projects = ((WSRoot) parent).getProjects(); for (WSProject wsProject : projects) { allNames.add(wsProject.getName()); } EList<WSProjectLink> links = ((WSRoot) parent).getProjectLinks(); for (WSProjectLink wsProjectLink : links) { allNames.add(wsProjectLink.getName()); } } return allNames; } private EContentAdapter adapter; private TreeViewer viewer; private final List<Button> buttons = new ArrayList<Button>(); private WSAction.Remove removeAction; private WSAction.OpenFile openFileAction; }