Java tutorial
/* * Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available * at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * * Description: * */ package com.nokia.tools.s60.views; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.eclipse.core.resources.IFile; import org.eclipse.draw2d.ColorConstants; import org.eclipse.gef.EditPart; import org.eclipse.gef.commands.CommandStack; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.DelegatingDragAdapter; import org.eclipse.jface.util.DelegatingDropAdapter; import org.eclipse.jface.util.TransferDragSourceListener; import org.eclipse.jface.util.TransferDropTargetListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.Page; import org.eclipse.ui.views.navigator.LocalSelectionTransfer; import com.nokia.tools.content.core.IContent; import com.nokia.tools.content.core.IContentAdapter; import com.nokia.tools.content.core.IContentData; import com.nokia.tools.media.color.ColorUtil; import com.nokia.tools.media.utils.layers.IImage; import com.nokia.tools.media.utils.layers.IImageAdapter; import com.nokia.tools.media.utils.layers.ILayer; import com.nokia.tools.media.utils.svg.ColorGroup; import com.nokia.tools.media.utils.svg.ColorGroupItem; import com.nokia.tools.media.utils.svg.ColorGroups; import com.nokia.tools.media.utils.svg.ColorGroupsStore; import com.nokia.tools.s60.editor.Series60EditorPart; import com.nokia.tools.s60.editor.actions.ColorizeColorGroupAction; import com.nokia.tools.screen.core.IScreenAdapter; import com.nokia.tools.screen.core.IScreenFactory; import com.nokia.tools.screen.ui.ISkinnableEntityAdapter; import com.nokia.tools.screen.ui.propertysheet.color.ColorChangedLabelWrapper; import com.nokia.tools.screen.ui.propertysheet.color.ColorPickerComposite; import com.nokia.tools.screen.ui.propertysheet.color.IColorPickerListener; import com.nokia.tools.screen.ui.utils.EclipseUtils; import com.nokia.tools.screen.ui.utils.ScreenUtil; import com.nokia.tools.ui.tooltip.CompositeInformationControl; import com.nokia.tools.ui.tooltip.CompositeTooltip; public class ColorViewPage extends Page implements ISelectionListener, IMenuListener { private static String NAME_COLUMN = "name"; private static String ID_COLUMN = "id"; private static List<String> tableColumns; private static List<String> tableColumnsSortingOrder; static { tableColumns = new ArrayList<String>(); tableColumnsSortingOrder = new ArrayList<String>(); tableColumns.add(NAME_COLUMN); tableColumns.add(ID_COLUMN); tableColumnsSortingOrder.add(ID_COLUMN); tableColumnsSortingOrder.add(NAME_COLUMN); } private IEditorPart sourceEditor; private TreeViewer treeViewer; IDGroupContainer container; /** * Container of IDGroups * */ class IDGroupContainer { /** * pair of <Group name, Group> */ private HashMap<String, IDGroup> groupMap = new HashMap<String, IDGroup>(); /** * List of checked groups */ List<String> checkedGroupNames = new ArrayList<String>(); public void checkGroup(String groupName) { if (!checkedGroupNames.contains(groupName)) { checkedGroupNames.add(groupName); } } public void uncheckGroup(String groupName) { if (checkedGroupNames.contains(groupName)) { checkedGroupNames.remove(groupName); } } public IDGroup getGroup(String groupName) { return groupMap.get(groupName); } public ArrayList<ElementTableItem> getAllAllowedItems() { // returns sorted list of all allowed items ArrayList<ElementTableItem> itemsFromCheckedGroups = getSortedItemsFromCheckedGroups( checkedGroupNames.toArray(new String[checkedGroupNames.size()])); Collections.sort(itemsFromCheckedGroups); return itemsFromCheckedGroups; } public void putGroup(String groupName, IDGroup group) { groupMap.put(groupName, group); } /** * Returns all ids from checked groups */ public ArrayList<ElementTableItem> getSortedItemsFromCheckedGroups(String[] checkedGroups) { ArrayList<ElementTableItem> items = new ArrayList<ElementTableItem>(); // if none of the groups is checked - it is the same as all groups // were checked if (checkedGroups.length == 0) { checkedGroups = IDGroupContainer.this.getGroupNames(); } for (int i = 0; i < checkedGroups.length; i++) { IDGroup group = getGroup(checkedGroups[i]); SortedSet<ElementTableItem> allIds = group.getAll(); items.addAll(allIds); } return items; } public String[] getGroupNames() { Set<String> groupNameSet = groupMap.keySet(); String[] groupNames = groupNameSet.toArray(new String[groupNameSet.size()]); return groupNames; } public void setPropertyToNewValue(String itemName, String property, String propertyValue) { for (IDGroup grp : groupMap.values()) { SortedSet<ElementTableItem> items = grp.getAll(); for (ElementTableItem item : items) { if (item.getProperty(NAME_COLUMN).equals(itemName)) { item.setProperty(property, propertyValue); break; } } } } } /** * Container of Item ids * */ class IDGroup { public IDGroup(String name) { this.name = name; } public String getName() { return name; } /** * Group name */ private String name; private SortedSet<ElementTableItem> groupItems = new TreeSet<ElementTableItem>(); public void add(ElementTableItem id) { groupItems.add(id); } public void addAll(SortedSet<ElementTableItem> idSet) { groupItems.addAll(idSet); } public SortedSet<ElementTableItem> getAll() { return groupItems; } } class ElementTableItem implements Comparable<ElementTableItem> { private boolean isSet; Map<String, String> propertiesMap = new HashMap<String, String>(); List<String> propertyNamesSortingPriorityList = new ArrayList<String>(); public ElementTableItem(List<String> propertyNames, List<String> propertyNamesSortingPriorityList) { for (String property : propertyNames) { if (property != null && property.length() > 0) { propertiesMap.put(property, ""); } } this.propertyNamesSortingPriorityList = propertyNamesSortingPriorityList; } public void setProperty(String property, String propertyValue) { if (propertiesMap.containsKey(property)) { propertiesMap.put(property, propertyValue); } else if ("isSkinned".equals(property)) { if ("T".equals(propertyValue)) { setSet(true); } else if ("F".equals(propertyValue)) { setSet(false); } } } public String getProperty(String propertyName) { return propertiesMap.get(propertyName); } public boolean isSet() { return isSet; } public void setSet(boolean isSkinned) { this.isSet = isSkinned; } public int compareTo(ElementTableItem item) { for (String property : propertyNamesSortingPriorityList) { if (this.getProperty(property) != null) { if (this.getProperty(property).equals(item.getProperty(property))) { continue; // if the first match fix go to another // property } else { return this.getProperty(property).compareTo(item.getProperty(property)); } } else { return "".compareTo(item.getProperty(property)); } } return 0; } public int compareTo(String item) { for (String property : propertyNamesSortingPriorityList) { if (this.getProperty(property) != null) { if (this.getProperty(property).equals(item)) { continue; // if the first match fix go to another // property } else { return this.getProperty(property).compareTo(item); } } else { return "".compareTo(item); } } return 0; } public int compareToProperty(Object o, String propertyName) { if (o instanceof ElementTableItem) { ElementTableItem tmp = (ElementTableItem) o; return this.getProperty(propertyName).compareTo(tmp.getProperty(propertyName)); } else if (o instanceof String) { return this.getProperty(propertyName).compareTo((String) o); } else { throw new ClassCastException(); } } public int setCompareTo(Object o) { if (o instanceof ElementTableItem) { ElementTableItem tmp = (ElementTableItem) o; return new Boolean(this.isSet()).compareTo(tmp.isSet()); } else { throw new ClassCastException(); } } } public IDGroupContainer digTheTree(IContentData root) { IDGroupContainer groupContainer = new IDGroupContainer(); for (IContentData n1 : root.getChildren()) { if (n1.getAdapter(IScreenAdapter.class) != null) { continue; } IDGroup group = new IDGroup(n1.getName()); for (IContentData n2 : n1.getChildren()) { SortedSet<ElementTableItem> icons = new TreeSet<ElementTableItem>(); for (IContentData n3 : n2.getChildren()) { for (IContentData n4 : n3.getChildren()) { // if(n4 instanceof ThemeBasicData){ // ThemeBasicData data= (ThemeBasicData)n4; // data.supportsPlatform(""); // // } // ((ThemeContent) // n1.getRoot()).supportsPlatform(DevicePlatform.S60_2_0, // n4.getId()); ElementTableItem eti = new ElementTableItem(tableColumns, tableColumnsSortingOrder); eti.setProperty(NAME_COLUMN, n4.getName()); eti.setProperty(ID_COLUMN, n4.getId()); icons.add(eti); } } group.addAll(icons); } groupContainer.putGroup(group.getName(), group); } return groupContainer; } // Creating input for table viewer private void createInput2() { IEditorPart activeEd = EclipseUtils.getActiveSafeEditor(); if (activeEd != null) { IContentAdapter adapter = (IContentAdapter) activeEd.getAdapter(IContentAdapter.class); if (adapter != null) { IContent[] cnt = adapter.getContents(); IContent root = ScreenUtil.getPrimaryContent(cnt); if (root != null) { container = digTheTree(root); } /* * listOfContentDataNames.addAll(setOfContentDataNames); // sort * list to enable faster filtering * Collections.sort(listOfContentDataNames); */} } } public void generateColorGroupsForCurrentScreen() { IEditorPart activeEd = EclipseUtils.getActiveSafeEditor(); IContent root = null; String screenTitle = ""; if (activeEd instanceof Series60EditorPart) { Series60EditorPart sep = (Series60EditorPart) activeEd; String screenTitleWithProjectName = sep.getTitle(); String[] separatedScreenTitleWithProjectName = screenTitleWithProjectName.split(" - "); if (separatedScreenTitleWithProjectName.length == 2) { screenTitle = separatedScreenTitleWithProjectName[1]; } IContent[] cnt = sep.getContents(); root = ScreenUtil.getPrimaryContent(cnt); } ColorGroups grps = null; if (activeEd != null && ColorGroupsStore.isEnabled) { IFile original = ((FileEditorInput) sourceEditor.getEditorInput()).getFile(); grps = ColorGroupsStore.getColorGroupsForProject(original.getProject()); } else { IFile original = ((FileEditorInput) sourceEditor.getEditorInput()).getFile(); grps = ColorGroupsStore.getColorGroupsForProject(original.getProject()); return; } int groupNo = 0; IScreenFactory factory = (IScreenFactory) root.getAdapter(IScreenFactory.class); for (IContentData n1 : factory.getScreens()) { if (screenTitle.equals(n1.getId())) { for (IContentData n2 : n1.getChildren()) { String name = n2.getName(); String id = n2.getId(); IContentData data = root.findByName(name); if (id == null) { System.out.println(name + " <-name ->id " + id); } IImageAdapter imageAdapter = (IImageAdapter) data.getAdapter(IImageAdapter.class); IImage image = imageAdapter.getImage(); if (image.getLayerCount() > 0) { ILayer layer = image.getLayer(0); Map<RGB, Integer> colors = layer.getColors(); if (colors != null) { for (RGB rgb : colors.keySet()) { ColorGroupItem colorGroupItem; if (id != null) { colorGroupItem = new ColorGroupItem(id, null, null); } else { colorGroupItem = new ColorGroupItem(name, null, null); } ColorGroup grp = grps.getGroupByRGB(rgb); if (grp != null) { // if group with color // exist add the // item to it grp.addItemToGroup(colorGroupItem); } else { // else try to find group with // same hue grp = grps.getGroupByColorHue(rgb); if (grp != null) { // add to subgroup ColorGroup childGrp = new ColorGroup(rgb, "group" + groupNo++, grps); childGrp.addItemToGroup(colorGroupItem); childGrp.setParentGroupName(grp.getName()); grp.addChildrenGroup(childGrp.getName()); grps.addGroup(childGrp); // System.out.println("adding // subgroup"); } else { // create new group grp = new ColorGroup(rgb, "group" + groupNo++, grps); grp.addItemToGroup(colorGroupItem); grps.addGroup(grp); // int hue = (int) (rgb.getHSB()[0] // * 360); // System.out // .println("creating new group with // hue" // + hue); } } } } } } } } } public void generateColorGroups() { List<ElementTableItem> allItems = container.getAllAllowedItems(); IEditorPart activeEd = EclipseUtils.getActiveSafeEditor(); IContent root = null; if (activeEd instanceof Series60EditorPart) { Series60EditorPart sep = (Series60EditorPart) activeEd; IContent[] cnt = sep.getContents(); root = ScreenUtil.getPrimaryContent(cnt); } ColorGroups grps = null; if (activeEd != null && ColorGroupsStore.isEnabled) { IFile original = ((FileEditorInput) sourceEditor.getEditorInput()).getFile(); grps = ColorGroupsStore.getColorGroupsForProject(original.getProject()); } else { IFile original = ((FileEditorInput) sourceEditor.getEditorInput()).getFile(); grps = ColorGroupsStore.getColorGroupsForProject(original.getProject()); return; } int groupNo = 0; for (ElementTableItem item : allItems) { String name = item.getProperty(NAME_COLUMN); String id = item.getProperty(ID_COLUMN); IContentData data = root.findByName(name); IImageAdapter imageAdapter = (IImageAdapter) data.getAdapter(IImageAdapter.class); IImage image = imageAdapter.getImage(); if (image.getLayerCount() > 0) { ILayer layer = image.getLayer(0); Map<RGB, Integer> colors = layer.getColors(); if (colors != null) { for (RGB rgb : colors.keySet()) { ColorGroupItem colorGroupItem = new ColorGroupItem(id, null, null); ColorGroup grp = grps.getGroupByRGB(rgb); if (grp != null) { // if group with color exist add the // item to it grp.addItemToGroup(colorGroupItem); } else { // else try to find group with same hue grp = grps.getGroupByColorHue(rgb); if (grp != null) { // add to subgroup ColorGroup childGrp = new ColorGroup(rgb, "group" + groupNo++, grps); childGrp.addItemToGroup(colorGroupItem); childGrp.setParentGroupName(grp.getName()); grp.addChildrenGroup(childGrp.getName()); grps.addGroup(childGrp); // System.out.println("adding subgroup"); } else { // create new group grp = new ColorGroup(rgb, "group" + groupNo++, grps); grp.addItemToGroup(colorGroupItem); grps.addGroup(grp); // int hue = (int) (rgb.getHSB()[0] * 360); // System.out // .println("creating new group with hue" // + hue); } } } } } } } public IEditorPart getSourceEditor() { return sourceEditor; } public Object[] EMPTY_ARRAY = new Object[0]; public ColorViewPage(IEditorPart sourceEd) { this.sourceEditor = sourceEd; } Composite composite = null; @Override public void createControl(Composite parent) { // PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, // SearchAction.HLP_CTX); composite = new Composite(parent, SWT.NONE); composite.setBackground(ColorConstants.yellow); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout gl = new GridLayout(); gl.marginTop = gl.marginBottom = gl.marginLeft = gl.marginRight = gl.marginWidth = gl.marginHeight = 0; composite.setLayout(gl); createCompositeArea(composite); createActions(); createToolbar(); } @Override public Control getControl() { return composite; } @Override public void setFocus() { try { refreshViewer(); } catch (Exception e) { e.printStackTrace(); } } Action switchLayoutAction = null; ListViewer listViewer; /** * Create toolbar. */ private void createToolbar() { IToolBarManager mgr = getSite().getActionBars().getToolBarManager(); mgr.add(switchLayoutAction); } private void createActions() { switchLayoutAction = new Action("Generate color groups...") { public void run() { createInput2(); // generateColorGroups(); generateColorGroupsForCurrentScreen(); refreshViewer(); } }; } private void recalculateLayout() { } public void createCompositeArea(Composite parent) { Composite dialogArea = parent; parent.getParent().addFocusListener(new FocusAdapter() { // this is to ensure that after opening when user selects pattern // input he can see // all items @Override public void focusGained(FocusEvent event) { try { treeViewer.getLabelProvider().dispose(); treeViewer.setInput(createInput()); } catch (Exception e) { e.printStackTrace(); } } }); treeViewer = new TreeViewer(dialogArea, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); Tree tree = treeViewer.getTree(); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); treeViewer.setContentProvider(new TreeViewContentProvider()); treeViewer.setLabelProvider(new TreeViewLabelProvider()); treeViewer.getLabelProvider().dispose(); treeViewer.setInput(createInput()); addDragAndDropSupport(); hookContextMenu(); createTooltip(treeViewer.getTree()); } private CompositeTooltip createTooltip(final Tree tree) { CompositeTooltip tooltip = new CompositeTooltip() { TreeItem item; @Override public void initControl(CompositeInformationControl informationControl) { super.initControl(informationControl); if (item != null && !item.isDisposed()) { Rectangle rect = item.getBounds(0); Point size = new Point(informationControl.getBounds().width, informationControl.getBounds().height); Point pt = tree.toDisplay(rect.x - size.x + 10, rect.y + 5); // (-6*size.x/7,0);// if (pt.y + size.y > tree.getDisplay().getBounds().height) { pt.y = tree.getDisplay().getBounds().height - size.y; } informationControl.setLocation(pt); } } @Override protected Rectangle getControlBounds() { if (item != null && !item.isDisposed()) { Point treeLoc = tree.getLocation(); Rectangle itemBounds = item.getBounds(0); return new Rectangle(treeLoc.x + itemBounds.x, treeLoc.y + itemBounds.y, itemBounds.width, itemBounds.height); } else { return super.getControlBounds(); } } @Override public void hide() { super.hide(); item = null; } @Override protected void mouseExit(MouseEvent e) { super.mouseExit(e, 250); } @Override protected void mouseHover(MouseEvent e) { if (e.widget == tree) { TreeItem newItem = tree.getItem(new Point(e.x, e.y)); if (newItem != item) { hide(); } item = newItem; if (item != null) { if (item.getData() instanceof ColorGroup) { ColorGroup data = (ColorGroup) item.getData(); if (!data.hasParent()) { super.mouseHover(e); return; } } } hide(); } } @Override protected CompositeInformationControl createFocusedControl() { return createUnfocusedControl(); } @Override protected CompositeInformationControl createUnfocusedControl() { final TreeItem currItem = item; RGB inputRgb = ((ColorGroup) currItem.getData()).getGroupColor(); CompositeInformationControl cic = super.createUnfocusedControl(); final Composite root = cic.getComposite(); GridLayout gl = new GridLayout(1, false); gl.marginWidth = gl.marginHeight = 0; root.setLayout(gl); final ColorChangedLabelWrapper colorChangedLabelWrapper = new ColorChangedLabelWrapper(); colorChangedLabelWrapper.setColorString(ColorUtil.asHashString(inputRgb)); IColorPickerListener colorPickerListener = new IColorPickerListener() { public void selectionChanged() { okCloseDialog(); } public void okCloseDialog() { Display.getDefault().asyncExec(new Runnable() { public void run() { hide(true); } }); RGB newColor = colorChangedLabelWrapper.getColorDescriptor().getRGB(); handleColorChange(newColor, (ColorGroup) currItem.getData()); System.out.println("changing color"); } }; new ColorPickerComposite(root, SWT.NONE, colorChangedLabelWrapper, colorPickerListener); return cic; } }; tooltip.setControl(tree); return tooltip; } public void handleColorChange(RGB newColor, ColorGroup grp) { ColorGroup referencedGroup = grp; RGB referencedColor = referencedGroup.getGroupColor(); RGB changingRGB = newColor; final List<IContentData> items = findContentDataForGroup(referencedGroup); // final List<ColorGroupItem> items= ((ColorGroup) // data[2]).getGroupItems(); ISelectionProvider sp = new ISelectionProvider() { public ISelection getSelection() { return new StructuredSelection(items); } public void addSelectionChangedListener(ISelectionChangedListener listener) { } public void removeSelectionChangedListener(ISelectionChangedListener listener) { } public void setSelection(ISelection selection) { } }; ColorizeColorGroupAction colorGroupAction = new ColorizeColorGroupAction(sp, null, treeViewer); colorGroupAction.setColorGroups(getColorGroups()); colorGroupAction.setColor(changingRGB, referencedColor, 255); if (colorGroupAction.isEnabled()) { colorGroupAction.setColorGroup(referencedGroup); colorGroupAction.run(); } for (String childGroupName : referencedGroup.getChildrenGroups()) { ColorGroup childGroup = getColorGroups().getGroupByName(childGroupName); changingRGB = changeHueValue(childGroup.getGroupColor(), referencedGroup.getGroupColor()); final List<IContentData> itemsInside = findContentDataForGroup(childGroup); sp = new ISelectionProvider() { public ISelection getSelection() { return new StructuredSelection(itemsInside); } public void addSelectionChangedListener(ISelectionChangedListener listener) { } public void removeSelectionChangedListener(ISelectionChangedListener listener) { } public void setSelection(ISelection selection) { } }; colorGroupAction = new ColorizeColorGroupAction(sp, null, treeViewer); colorGroupAction.setColorGroups(getColorGroups()); colorGroupAction.setColor(changingRGB, childGroup.getGroupColor(), 255); if (colorGroupAction.isEnabled()) { colorGroupAction.setColorGroup(childGroup); colorGroupAction.run(); } } refreshViewer(); } public ColorGroups createInput() { IFile original = ((FileEditorInput) sourceEditor.getEditorInput()).getFile(); ColorGroups grps = ColorGroupsStore.getColorGroupsForProject(original.getProject()); return grps; } class TreeViewLabelProvider extends LabelProvider { private List<Image> images = new ArrayList<Image>(); public Image getImage(Object obj) { Image image = null; if (obj instanceof ColorGroup) { ImageDescriptor desc = null; RGB rgb = ((ColorGroup) obj).getGroupColor(); RGB white = new RGB(255, 255, 255); PaletteData paletteData = new PaletteData(new RGB[] { white, rgb }); ImageData imageData = new ImageData(15, 15, 1, paletteData); // for (int x = 0; x < 15; x++) { // for (int y = 0; y < 15; y++) { // imageData.setPixel(x, y, 0); // } // } desc = ((ImageDescriptor.createFromImageData(imageData))); image = desc.createImage(); GC gc = new GC(image); Color color = new Color(null, rgb); gc.setBackground(color); gc.fillRoundRectangle(0, 0, 15, 15, 10, 10); gc.dispose(); color.dispose(); images.add(image); } else if (obj instanceof ColorGroupItem) { if (sourceEditor instanceof Series60EditorPart) { Series60EditorPart sep = (Series60EditorPart) sourceEditor; IContent[] cnt = sep.getContents(); IContent root = ScreenUtil.getPrimaryContent(cnt); IContentData data = root.findById(((ColorGroupItem) obj).getItemId()); if (data != null) { ImageDescriptor desc = data.getImageDescriptor(20, 20); image = desc.createImage(); images.add(image); } } } return image; } public String getText(Object obj) { String text = ""; if (obj instanceof ColorGroups) { text = ((ColorGroups) obj).getThemeName(); } else if (obj instanceof ColorGroup) { ColorGroup grp = ((ColorGroup) obj); String countText = grp.getGroupItems().size() > 1 ? " (cnt " + grp.getGroupItems().size() + ")" : ""; text = grp.getName() + countText; } else if (obj instanceof ColorGroupItem) { Series60EditorPart sep = (Series60EditorPart) sourceEditor; IContent[] cnt = sep.getContents(); IContent root = ScreenUtil.getPrimaryContent(cnt); IContentData data = root.findById(((ColorGroupItem) obj).getItemId()); if (data != null) { text = data.getName(); if ("".equals(text)) { text = data.getId(); } } else { text = ((ColorGroupItem) obj).getItemId(); } } return text; } public void dispose() { for (Image img : images) { img.dispose(); img = null; } images.clear(); } } class TreeViewContentProvider implements IStructuredContentProvider, ITreeContentProvider { private ColorGroups grps = null; public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { return getChildren(parent); } public Object getParent(Object child) { return null; } public Object[] getChildren(Object parentElement) { if (parentElement instanceof ColorGroups) { grps = (ColorGroups) parentElement; return ((ColorGroups) parentElement).getParentGroups().toArray(); } else if (parentElement instanceof ColorGroup) { ColorGroup grp = (ColorGroup) parentElement; List<Object> objectsToReturn = new ArrayList<Object>(); if (grp.hasChildrenGroup()) { for (String groupName : grp.getChildrenGroups()) { if (grps != null) { ColorGroup group = grps.getGroupByName(groupName); objectsToReturn.add(group); } } } Map<String, Object> mapForRemovingDuplicity = new HashMap<String, Object>(); for (ColorGroupItem item : grp.getGroupItems()) { mapForRemovingDuplicity.put(item.getItemId(), item); } objectsToReturn.addAll(mapForRemovingDuplicity.values()); return objectsToReturn.toArray(); } return EMPTY_ARRAY; } public boolean hasChildren(Object element) { return getChildren(element).length > 0; } } // DND support private void addDragAndDropSupport() { final LocalSelectionTransfer localTransfer = LocalSelectionTransfer.getInstance(); final FileTransfer fileTransfer = FileTransfer.getInstance(); DelegatingDragAdapter dragAdapter = new DelegatingDragAdapter(); dragAdapter.addDragSourceListener(new ColorViewDragSourceListener(localTransfer, treeViewer)); DelegatingDropAdapter dropAdapter = new DelegatingDropAdapter(); dropAdapter.addDropTargetListener(new ColorViewDropTargetListener(localTransfer, null)); Transfer transfers[] = new Transfer[] { localTransfer, fileTransfer }; treeViewer.addDragSupport(DND.DROP_COPY, transfers, dragAdapter); treeViewer.addDropSupport(DND.DROP_COPY, transfers, dropAdapter); } class ColorViewDragSourceListener implements TransferDragSourceListener { private Transfer transfer; private ISelectionProvider provider; private Object eventData; private int eventDetail; private Object eventDataLocal; public ColorViewDragSourceListener(LocalSelectionTransfer t, ISelectionProvider provider) { this.transfer = t; this.provider = provider; } public Transfer getTransfer() { return transfer; } public void dragFinished(DragSourceEvent event) { } protected Object getSelectedElement(DragSourceEvent evt) { DragSource ds = (DragSource) evt.widget; if (ds.getControl() instanceof Tree) { Tree tree = (Tree) ds.getControl(); TreeItem treeItem = tree.getSelection()[0]; if (treeItem == null) { return null; } else { return treeItem.getData(); } } else { IStructuredSelection selected = (IStructuredSelection) provider.getSelection(); return selected.getFirstElement(); } } public void dragStart(DragSourceEvent event) { event.detail = DND.DROP_NONE; if (transfer == LocalSelectionTransfer.getInstance()) { LocalSelectionTransfer.getInstance().setSelection(null); } Object selectedData = getSelectedElement(event); if (selectedData instanceof ColorGroup) { // add to the localselection transfer ISelection selection = new StructuredSelection(selectedData); LocalSelectionTransfer.getInstance().setSelection(selection); } } public void dragSetData(DragSourceEvent event) { if (transfer instanceof LocalSelectionTransfer && eventDataLocal != null) { event.data = eventDataLocal; event.detail = eventDetail; } } } class ColorViewDropTargetListener implements TransferDropTargetListener { public ColorViewDropTargetListener(LocalSelectionTransfer t, CommandStack stack) { this.stack = stack; this.transfer = t; } private CommandStack stack; private Transfer transfer; public Transfer getTransfer() { return transfer; } public boolean isEnabled(DropTargetEvent event) { return true; } /** * returns element that is tarrget of drop operation * * @param evt * @return */ protected Object getSelectedElement(DropTargetEvent evt) { DropTarget dt = (DropTarget) evt.widget; if (dt.getControl() instanceof Tree) { TreeItem treeItem = null; treeItem = (TreeItem) evt.item; if (treeItem == null) { return null; } else { return treeItem.getData(); } } else { ISelectionProvider provider = getSelectionProviderForGenericCommand(evt); if (provider != null) { return ((IStructuredSelection) provider.getSelection()).getFirstElement(); } } return null; } public void dragOver(DropTargetEvent event) { // set to none default, later enabled event.detail = DND.DROP_NONE; Object dropData = null; try { dropData = getDropData(event); } catch (Exception e) { e.printStackTrace(); return; } if (dropData instanceof ColorGroup) { event.detail = DND.DROP_COPY; return; } } public void drop(DropTargetEvent event) { Object dropData = null; try { dropData = getDropData(event); } catch (Exception e) { e.printStackTrace(); return; } if (dropData instanceof ColorGroup) { ColorGroup droppedGroup = (ColorGroup) dropData; Object selectedElement = getSelectedElement(event); if (selectedElement instanceof ColorGroup) { ColorGroup referencedGroup = (ColorGroup) selectedElement; if (referencedGroup.hasParent()) {// child groups cannot // have children referencedGroup = getColorGroups().getGroupByName(referencedGroup.getParentGroupName()); if (referencedGroup == null) { System.out.println("group does not have existing parent, dropping failed"); return; } } RGB referencedColor = referencedGroup.getGroupColor(); List<ColorGroup> droppedGroups = new ArrayList<ColorGroup>(); if (droppedGroup.hasChildrenGroup()) { droppedGroups.add(droppedGroup); // add to the list // the dropped group for (String childGrpName : droppedGroup.getChildrenGroups()) { // and all its children ColorGroup childGrp = getColorGroups().getGroupByName(childGrpName); if (childGrp != null) { droppedGroups.add(childGrp); } } } else { droppedGroups.add(droppedGroup); } for (ColorGroup oneOfDroppedGroups : droppedGroups) { RGB droppedColor = oneOfDroppedGroups.getGroupColor(); RGB changingRGB = changeHueValue(droppedColor, referencedColor); final List<IContentData> items = findContentDataForGroup(oneOfDroppedGroups); // final List<ColorGroupItem> items= ((ColorGroup) // data[2]).getGroupItems(); ISelectionProvider sp = new ISelectionProvider() { public ISelection getSelection() { return new StructuredSelection(items); } public void addSelectionChangedListener(ISelectionChangedListener listener) { } public void removeSelectionChangedListener(ISelectionChangedListener listener) { } public void setSelection(ISelection selection) { } }; ColorizeColorGroupAction colorGroupAction = new ColorizeColorGroupAction(sp, stack, treeViewer); colorGroupAction.setColorGroups(getColorGroups()); colorGroupAction.setColor(changingRGB, droppedColor, 255); if (colorGroupAction.isEnabled()) { colorGroupAction.setColorGroup(oneOfDroppedGroups); colorGroupAction.run(); ColorGroup oldParentGroup = getColorGroups() .getGroupByName(oneOfDroppedGroups.getParentGroupName()); if (oldParentGroup != null) { // remove old parent to child link oldParentGroup.removeChildrenGroup(oneOfDroppedGroups.getName()); } // change child to parent link oneOfDroppedGroups.setParentGroupName(referencedGroup.getName()); // create new parent to child link referencedGroup.addChildrenGroup(oneOfDroppedGroups.getName()); } } } refreshViewer(); } } public void dragEnter(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT || event.detail == DND.DROP_MOVE) { if ((event.operations & DND.DROP_COPY) != 0 || (event.operations & DND.DROP_MOVE) != 0) { event.detail = DND.DROP_COPY; } else { event.detail = DND.DROP_NONE; } } } public Object getDropData(DropTargetEvent evt) { Transfer t = null; if (LocalSelectionTransfer.getInstance().isSupportedType(evt.currentDataType)) t = LocalSelectionTransfer.getInstance(); if (t.isSupportedType(evt.currentDataType)) { if (t instanceof LocalSelectionTransfer) { Object data = evt.data; if (data == null) { data = ((LocalSelectionTransfer) t).nativeToJava(evt.currentDataType); } if (data != null) { Object imageData = ((IStructuredSelection) data).getFirstElement(); return imageData; } } } return null; } public void dragOperationChanged(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { if ((event.operations & DND.DROP_COPY) != 0 || (event.operations & DND.DROP_MOVE) != 0) { // ok } else { event.detail = DND.DROP_NONE; } } } public void dropAccept(DropTargetEvent event) { } public void dragLeave(DropTargetEvent event) { } protected ISkinnableEntityAdapter getSkinnableEntityAdapter(DropTargetEvent event) { return null; } protected IWorkbenchPart getWorkbenchPart() { return null; } protected EditPart getSourceEditPart(DropTargetEvent event) { return null; } protected ISelectionProvider getSelectionProviderForGenericCommand(DropTargetEvent event) { return null; } protected void highlightDragOver(Control control) { } protected void removeHighlight(Control control) { } } public RGB changeHueValue(RGB colorToChange, RGB colorWithReferenceHueValue) { // Convert target RGB to HSB float[] hsbToChange = colorToChange.getHSB(); float saturationToChange = hsbToChange[1]; float brightnessToChange = hsbToChange[2]; // Convert reference RGB to HSB float[] hsbReference = colorWithReferenceHueValue.getHSB(); float hueReference = hsbReference[0]; // int rgb= Color.HSBtoRGB(hueReference, saturationToChange, // brightnessToChange); // int red = (rgb>>16)&0xFF; // int green = (rgb>>8)&0xFF; // int blue = rgb&0xFF; // RGB changedRGB= new RGB(red, green, blue); RGB changedRGB = new RGB(hueReference, saturationToChange, brightnessToChange); return changedRGB; } public void selectionChanged(IWorkbenchPart part, ISelection selection) { try { refreshViewer(); } catch (Exception e) { e.printStackTrace(); } } private List<IContentData> findContentDataForGroup(ColorGroup group) { List<IContentData> datas = new ArrayList<IContentData>(); if (sourceEditor instanceof Series60EditorPart) { IContent[] cnt = ((Series60EditorPart) sourceEditor).getContents(); IContent root = ScreenUtil.getPrimaryContent(cnt); for (ColorGroupItem item : group.getGroupItems()) { IContentData data = root.findById(item.getItemId()); if (data == null) { data = root.findByName(item.getItemId()); } datas.add(data); } } return datas; } private ColorGroups getColorGroups() { if (sourceEditor != null && ColorGroupsStore.isEnabled) { IFile original = ((FileEditorInput) sourceEditor.getEditorInput()).getFile(); return ColorGroupsStore.getColorGroupsForProject(original.getProject()); } else { return null; } } private MenuManager menuMgr; private void hookContextMenu() { menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(this); Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(menu); } public void menuAboutToShow(IMenuManager manager) { fillContextMenu(manager); } public void fillContextMenu(IMenuManager manager) { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); if (selection.getFirstElement() instanceof ColorGroup) { final ColorGroup selectedGroup = (ColorGroup) selection.getFirstElement(); if (selectedGroup.hasParent()) { IAction action = new Action("Remove from parent") { @Override public void run() { ColorGroup parentGroup = getColorGroups() .getGroupByName(selectedGroup.getParentGroupName()); selectedGroup.setParentGroupName(""); parentGroup.removeChildrenGroup(selectedGroup.getName()); refreshViewer(); } }; manager.add(action); } } } public void refreshViewer() { treeViewer.getLabelProvider().dispose(); treeViewer.setInput(createInput()); treeViewer.refresh(); } }