diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/StructureTreeTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/StructureTreeTab.java new file mode 100644 index 00000000000..6785a4bd459 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/StructureTreeTab.java @@ -0,0 +1,789 @@ +/******************************************************************************* + * Copyright (c) 2007 Intel Corporation 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: + * Intel Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.newui; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URI; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectNatureDescriptor; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.IWorkspaceDescription; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourceAttributes; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +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.Tree; +import org.eclipse.swt.widgets.TreeColumn; +import org.eclipse.swt.widgets.TreeItem; + +import org.eclipse.cdt.core.settings.model.ICBuildSetting; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICExclusionPatternPathEntry; +import org.eclipse.cdt.core.settings.model.ICExternalSetting; +import org.eclipse.cdt.core.settings.model.ICFileDescription; +import org.eclipse.cdt.core.settings.model.ICFolderDescription; +import org.eclipse.cdt.core.settings.model.ICLanguageSetting; +import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICResourceDescription; +import org.eclipse.cdt.core.settings.model.ICSettingContainer; +import org.eclipse.cdt.core.settings.model.ICSettingObject; +import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; +import org.eclipse.cdt.core.settings.model.extension.CBuildData; +import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; +import org.eclipse.cdt.core.settings.model.extension.CFolderData; +import org.eclipse.cdt.core.settings.model.extension.CLanguageData; +import org.eclipse.cdt.core.settings.model.extension.CResourceData; +import org.eclipse.cdt.core.settings.model.extension.CTargetPlatformData; + +import org.eclipse.cdt.internal.ui.CPluginImages; + +/** + * This tab is intended to browse + * contents of whole class such as ResourceDescription, + * ConfigurationDescription or ProjectDescription + * + * Notes: + * + * 1. All strings in the file remain unlocalized + * since they represent method names. + * 2. It is experimental functionality. Work is in progress. + * 3. Tree depth is limited by 12. Deeper branches are truncated. + * In future, more flexible mechanism will be applied instead. + * 4. Tree creation process is long enough now. To be optimized. + */ +public class StructureTreeTab extends AbstractCPropertyTab { + + private static final Class[] NOCLASS = new Class[0]; + private static final Image IMG = CPluginImages.get(CPluginImages.IMG_OBJS_REFACTORING_ERROR); + private static final String LB = "["; + private static final int NESTING_MAX = 12; + private static final int NESTING_CFG = 2; + private static final String RB = "]"; + + protected Button r_cfg; + protected Button r_prj; + protected Button r_res; + protected Tree tree; + + private boolean check(TreeItem ti, Object obj) { + if (obj == null || ti == null) return false; + int cnt = NESTING_MAX; + TreeItem tiSaved = ti; + while (--cnt > 0) { + ti = ti.getParentItem(); + if (ti == null) return true; + } + tiSaved.setText(2, "Maximal tree nesting"); + tiSaved.setImage(IMG); + return false; + } + + private int getDepth(TreeItem ti) { + int x = 0; + while (ti != null) { + ti = ti.getParentItem(); + x++; + } + return x; + } + + private TreeItem create(TreeItem ti0, String text, boolean val) { + TreeItem t = create(ti0, text, String.valueOf(val)); + t.setText(2, EMPTY_STR); + return t; + } + + private TreeItem create(TreeItem ti0, String text, int val) { + TreeItem t = create(ti0, text, String.valueOf(val)); + t.setText(2, EMPTY_STR); + return t; + } + private TreeItem create(TreeItem ti0, String text, long val) { + TreeItem t = create(ti0, text, String.valueOf(val)); + t.setText(2, "Long"); + return t; + } + + private TreeItem create(TreeItem ti0, String text, String val) { + TreeItem ti = ti0 == null ? new TreeItem(tree, 0) : new TreeItem(ti0, 0); + ti.setText(0, text == null ? "" : text); + ti.setText(1, val == null ? "" : val ); + ti.setText(2, "String"); + return ti; + } + + public void createControls(Composite parent) { + super.createControls(parent); + usercomp.setLayout(new GridLayout(2, false)); + + r_prj = new Button(usercomp, SWT.RADIO); + r_prj.setLayoutData(new GridData(GridData.BEGINNING)); + r_prj.setText(NewUIMessages.getResourceString("ConfigDescriptionTab.0")); //$NON-NLS-1$ + r_prj.setSelection(true); + r_prj.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + updateData(getResDesc()); + }}); + + Button b1 = new Button(usercomp, SWT.PUSH); + b1.setLayoutData(new GridData(GridData.END)); + b1.setText("Expand all"); + b1.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + expandAll(tree.getItem(0), true); + }}); + + r_cfg = new Button(usercomp, SWT.RADIO); + r_cfg.setLayoutData(new GridData(GridData.BEGINNING)); + r_cfg.setText(NewUIMessages.getResourceString("ConfigDescriptionTab.1")); //$NON-NLS-1$ + r_cfg.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + updateData(getResDesc()); + }}); + + Button b2 = new Button(usercomp, SWT.PUSH); + b2.setLayoutData(new GridData(GridData.END)); + b2.setText("Expand level..."); + b2.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + }}); + + r_res = new Button(usercomp, SWT.RADIO); + r_res.setLayoutData(new GridData(GridData.BEGINNING)); + r_res.setText(NewUIMessages.getResourceString("ConfigDescriptionTab.2")); //$NON-NLS-1$ + r_res.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + updateData(getResDesc()); + }}); + + Button b3 = new Button(usercomp, SWT.PUSH); + b3.setLayoutData(new GridData(GridData.END)); + b3.setText("Collapse all"); + b3.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + expandAll(tree.getItem(0), false); + }}); + + tree = new Tree(usercomp, SWT.BORDER); + GridData gd = new GridData(GridData.FILL_BOTH); + gd.horizontalSpan = 2; + tree.setLayoutData(gd); + + TreeColumn tc = new TreeColumn(tree, 0); + tc.setText("Property"); + tc.setWidth(200); + tc = new TreeColumn(tree, 0); + tc.setText("Value"); + tc.setWidth(100); + tc = new TreeColumn(tree, 0); + tc.setText("Class"); + tc.setWidth(100); + + tree.setHeaderVisible(true); + tree.setLinesVisible(true); + + tree.addSelectionListener(new SelectionListener() { + public void widgetDefaultSelected(SelectionEvent e) { + } + public void widgetSelected(SelectionEvent e) { + }}); + } + + private TreeItem createObj(TreeItem ti0, String text, Object obj) { + String s = EMPTY_STR; + if (obj != null) try { + Class c = obj.getClass(); + Method m = c.getMethod("getName", NOCLASS); + s = (String)m.invoke(obj, null); + } catch (NoSuchMethodException e) {} + catch(IllegalAccessException e) {} + catch(IllegalArgumentException e) {} + catch(InvocationTargetException e) {} + catch(ClassCastException e) {} + + TreeItem t = create(ti0, text, s); + if (obj != null) t.setText(2, obj.getClass().getName()); + return t; + } + + private void expand(TreeItem ti0, String text, CLanguageData[] lds) { + TreeItem ti = create(ti0, text, lds == null ? 0 : lds.length); + if (!check(ti, lds)) return; + for (int i=0; i NESTING_CFG) return ti; + + update(ti, "getBuildSetting()", cfg.getBuildSetting()); + create(ti, "getBuildSystemId()", cfg.getBuildSystemId()); + createObj(ti, "getBuildVariablesContributor()", cfg.getBuildVariablesContributor()); + expand(ti, "getChildSettings()", cfg.getChildSettings()); + update(ti, "getConfigurationData()", cfg.getConfigurationData()); + create(ti, "getDescription()", cfg.getDescription()); + expand(ti, "getExternalSettings()", cfg.getExternalSettings()); + expand(ti, "getFileDescriptions()", cfg.getFileDescriptions()); + expand(ti, "getFolderDescriptions()", cfg.getFolderDescriptions()); + create(ti, "getId()", cfg.getId()); + create(ti, "getName()", cfg.getName()); + update(ti, "getParent()", cfg.getParent()); +// TODO: + cfg.getReferenceInfo(); + expand(ti, "getResourceDescriptions()", cfg.getResourceDescriptions()); + update(ti, "getRootFolderDescription()", cfg.getRootFolderDescription()); + expand(ti, "getSourceEntries()", cfg.getSourceEntries()); + update(ti, "getTargetPlatformSetting()", cfg.getTargetPlatformSetting()); + create(ti,"getType()",cfg.getType()); + create(ti,"isActive()",cfg.isActive()); + create(ti,"isModified()",cfg.isModified()); + create(ti,"isPreferenceConfiguration()",cfg.isPreferenceConfiguration()); + create(ti,"isReadOnly()",cfg.isReadOnly()); + create(ti,"isValid()",cfg.isValid()); + return ti; + } + private TreeItem update(TreeItem ti0, String text, ICExclusionPatternPathEntry s) { + TreeItem ti = createObj(ti0, text, s); + if (!check(ti, s)) return ti; + char[][] chrs = s.fullExclusionPatternChars(); + TreeItem ti1 = create(ti, "fullExclusionPatternChars()", chrs.length); + for (int j=0; j NESTING_CFG) return ti; + expand(ti, "getChildSettings()", c.getChildSettings()); + return ti; + } + + private TreeItem update(TreeItem ti0, String text, ICSettingObject obj) { + TreeItem ti = createObj(ti0, text, obj); + if (!check(ti, obj)) return ti; + if (obj instanceof ICTargetPlatformSetting) { + expand(ti, "getBinaryParserIds()", ((ICTargetPlatformSetting)obj).getBinaryParserIds()); +// update(ti, "getParent()", obj.getParent()); +// } else { // do not expand configuration descr to avoid dead loop + } + createObj(ti, "getParent()", obj.getParent()); + update(ti, "getConfiguration()", obj.getConfiguration()); + create(ti, "getId()", obj.getId()); + create(ti, "getName()", obj.getName()); + create(ti, "getType()", obj.getType()); + create(ti,"isReadOnly()", obj.isReadOnly()); + create(ti,"isValid()",obj.isValid()); + return ti; + } + private TreeItem update(TreeItem ti0, String text, ICTargetPlatformSetting obj) { + TreeItem ti = createObj(ti0, text, obj); + if (!check(ti, obj)) return ti; + update(ti, "getConfiguration()", obj.getConfiguration()); + create(ti, "getId()", obj.getId()); + create(ti, "getName()", obj.getName()); + update(ti, "getParent()", obj.getParent()); + create(ti, "getType()", obj.getType()); + create(ti,"isReadOnly()", obj.isReadOnly()); + create(ti,"isValid()",obj.isValid()); + return ti; + } + + private TreeItem update(TreeItem ti0, String text, IPath p) { + TreeItem ti = createObj(ti0, text, p); + if (!check(ti, p)) return ti; + create(ti, "getDevice()", p.getDevice()); + create(ti, "getFileExtension()", p.getFileExtension()); + create(ti, "hasTrailingSeparator()", p.hasTrailingSeparator()); + create(ti, "isAbsolute()", p.isAbsolute()); + create(ti, "isEmpty()", p.isEmpty()); + create(ti, "isRoot()", p.isRoot()); + create(ti, "isUNC()", p.isUNC()); + TreeItem ti1 = create(ti, "segmentCount()", p.segmentCount()); + for (int i=0; i