diff options
51 files changed, 1851 insertions, 242 deletions
diff --git a/features/org.eclipse.net4j.tests-feature/feature.xml b/features/org.eclipse.net4j.tests-feature/feature.xml index 7d3567d0d8..9306750e2f 100644 --- a/features/org.eclipse.net4j.tests-feature/feature.xml +++ b/features/org.eclipse.net4j.tests-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.net4j.tests" label="%featureName" - version="4.2.100.qualifier" + version="4.2.200.qualifier" provider-name="%providerName" license-feature="org.eclipse.emf.cdo.license" license-feature-version="0.0.0"> diff --git a/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters index 5e030d422d..6c0a1fc2af 100644 --- a/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters @@ -7,6 +7,12 @@ <message_argument value="4.1.0"/> </message_arguments> </filter> + <filter id="923795461"> + <message_arguments> + <message_argument value="4.4.0"/> + <message_argument value="4.3.0"/> + </message_arguments> + </filter> </resource> <resource path="META-INF/MANIFEST.MF" type="org.eclipse.emf.cdo.spi.common.id.AbstractCDOIDByteArray"> <filter id="305324134"> diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java index e09f2311eb..3b8307bd8f 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java @@ -28,9 +28,11 @@ public interface CDOProtocolConstants /** * @since 4.2 + * @noreference This field is not intended to be referenced by clients. */ - public static final int PROTOCOL_VERSION = 23; // Fix branch renaming + public static final int PROTOCOL_VERSION = 24; // SIGNAL_LOAD_OBJECT_LIFETIME + // public static final int PROTOCOL_VERSION = 23; // Fix branch renaming // public static final int PROTOCOL_VERSION = 22; // Prefetch returns RevisionInfo instead of CDORevision to have // PointerCDORevision // public static final int PROTOCOL_VERSION = 21; // Update how CDOChangeSetData's detachedObject is encoded, see @@ -291,6 +293,11 @@ public interface CDOProtocolConstants */ public static final short SIGNAL_RENAME_BRANCH = 58; + /** + * @since 4.4 + */ + public static final short SIGNAL_LOAD_OBJECT_LIFETIME = 59; + // ////////////////////////////////////////////////////////////////////// // Session Refresh diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java index b87b81e235..a33b401d98 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.CDOCommonSession; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchManager; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.id.CDOID; @@ -43,7 +44,7 @@ import java.util.List; * If querying by timestamp it's also possible to ask for multiple revisions (identified by a list of object IDs) in one * round trip (to the server if this revision manager is contained by a {@link CDOCommonSession session} or to the * backend store if it is contained by a {@link CDOCommonRepository repository}. - * + * * @author Eike Stepper * @since 3.0 * @noextend This interface is not intended to be extended by clients. @@ -60,7 +61,7 @@ public interface CDORevisionManager extends INotifier * cache, <code>null</code> otherwise. * <p> * Same as calling {@link #getObjectType(CDOID, CDOBranchManager) getObjectType(id, null)}. - * + * * @see EObject#eClass() * @see #getObjectType(CDOID, CDOBranchManager) */ @@ -80,7 +81,7 @@ public interface CDORevisionManager extends INotifier * A {@link CDOBranchManager branch manager} is required instead of just a boolean value to specify whether to * demand-load or not because this revision manager must be able to access the * {@link CDOBranchManager#getMainBranch() main branch} while demand-loading. - * + * * @see EObject#eClass() * @see #getObjectType(CDOID) * @since 4.1 @@ -91,7 +92,7 @@ public interface CDORevisionManager extends INotifier * Returns <code>true</code> if the {@link CDORevisionCache revision cache} contains a {@link CDORevision revision} * with the given {@link CDOID ID} at the given {@link CDOBranchPoint branch point} (branch + timestamp), * <code>false</code> otherwise. - * + * * @see CDORevisionManager#getRevision(CDOID, CDOBranchPoint, int, int, boolean) * @see CDORevisionManager#getRevisions(List, CDOBranchPoint, int, int, boolean) */ @@ -101,7 +102,7 @@ public interface CDORevisionManager extends INotifier * Returns the {@link CDORevision revision} with the given {@link CDOID ID} at the given {@link CDOBranchPoint branch * point} (branch + timestamp), optionally demand loading it if it is not already in the {@link CDORevisionCache * cache}. - * + * * @param referenceChunk * The number of target {@link CDOID IDs} to load for each many-valued reference in the returned revision, or * {@link CDORevision#UNCHUNKED} for all such list elements (IDs). @@ -124,7 +125,7 @@ public interface CDORevisionManager extends INotifier * Returns the {@link CDORevision revisions} with the given {@link CDOID IDs} at the given {@link CDOBranchPoint * branch point} (branch + timestamp), optionally demand loading them if they are not already in the * {@link CDORevisionCache cache}. - * + * * @param referenceChunk * The number of target {@link CDOID IDs} to load for each many-valued reference in the returned revisions, * or {@link CDORevision#UNCHUNKED} for all such list elements (IDs). @@ -147,7 +148,7 @@ public interface CDORevisionManager extends INotifier * Returns <code>true</code> if the {@link CDORevisionCache revision cache} contains a {@link CDORevision revision} * with the given {@link CDOID ID} at the given {@link CDOBranchVersion branch version} (branch + version), * <code>false</code> otherwise. - * + * * @see #getRevisionByVersion(CDOID, CDOBranchVersion, int, boolean) */ public boolean containsRevisionByVersion(CDOID id, CDOBranchVersion branchVersion); @@ -159,7 +160,7 @@ public interface CDORevisionManager extends INotifier * <p> * Prefetching of nested containment levels is not support by this method because the version of a particular revision * can not serve as a reasonable baseline criterium for a consistent graph of multiple revisions. - * + * * @param referenceChunk * The number of target {@link CDOID IDs} to load for each many-valued reference in the returned revision, or * {@link CDORevision#UNCHUNKED} for all such list elements (IDs). @@ -172,6 +173,11 @@ public interface CDORevisionManager extends INotifier boolean loadOnDemand); /** + * @since 4.4 + */ + public CDOBranchPointRange getObjectLifetime(CDOID id, CDOBranchPoint branchPoint); + + /** * @since 4.3 */ public void handleRevisions(EClass eClass, CDOBranch branch, boolean exactBranch, long timeStamp, boolean exactTime, diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java index fddd1d0662..685860e3ac 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java @@ -15,6 +15,7 @@ package org.eclipse.emf.cdo.internal.common.revision; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchManager; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.revision.CDORevision; @@ -266,6 +267,17 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi } } + public CDOBranchPointRange getObjectLifetime(CDOID id, CDOBranchPoint branchPoint) + { + if (revisionLoader instanceof RevisionLoader2) + { + RevisionLoader2 revisionLoader2 = (RevisionLoader2)revisionLoader; + return revisionLoader2.loadObjectLifetime(id, branchPoint); + } + + return null; + } + public InternalCDORevision getRevision(CDOID id, CDOBranchPoint branchPoint, int referenceChunk, int prefetchDepth, boolean loadOnDemand) { diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java index 67d1ef0a30..dbc1cc9995 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java @@ -12,6 +12,7 @@ package org.eclipse.emf.cdo.spi.common.revision; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.revision.CDORevision; @@ -32,6 +33,8 @@ import java.util.List; * * @author Eike Stepper * @since 3.0 + * @noimplement This interface is not intended to be implemented by clients. + * @noextend This interface is not intended to be extended by clients. */ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevisionCacheAdder, ILifecycle { @@ -97,8 +100,8 @@ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevis */ public interface RevisionLoader { - public List<RevisionInfo> loadRevisions(List<RevisionInfo> infos, CDOBranchPoint branchPoint, - int referenceChunk, int prefetchDepth); + public List<RevisionInfo> loadRevisions(List<RevisionInfo> infos, CDOBranchPoint branchPoint, int referenceChunk, + int prefetchDepth); public InternalCDORevision loadRevisionByVersion(CDOID id, CDOBranchVersion branchVersion, int referenceChunk); @@ -113,6 +116,19 @@ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevis * If the meaning of this type isn't clear, there really should be more of a description here... * * @author Eike Stepper + * @since 4.4 + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ + public interface RevisionLoader2 extends RevisionLoader + { + public CDOBranchPointRange loadObjectLifetime(CDOID id, CDOBranchPoint branchPoint); + } + + /** + * If the meaning of this type isn't clear, there really should be more of a description here... + * + * @author Eike Stepper * @since 3.0 */ public interface RevisionLocker diff --git a/plugins/org.eclipse.emf.cdo.dawn.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.dawn.tests/META-INF/MANIFEST.MF index 0d3543f7c4..9c146d69c3 100644 --- a/plugins/org.eclipse.emf.cdo.dawn.tests/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.dawn.tests/META-INF/MANIFEST.MF @@ -17,6 +17,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)", org.eclipse.ui;bundle-version="[3.4.0,4.0.0)", org.eclipse.emf.cdo.ui;bundle-version="[4.0.0,5.0.0)", org.eclipse.emf.cdo.dawn.util;bundle-version="[2.0.0,3.0.0)", + org.eclipse.emf.cdo.tests.ui;bundle-version="[4.0.0,5.0.0)", org.eclipse.swtbot.eclipse.core;bundle-version="[2.0.0,3.0.0)", org.eclipse.swtbot.eclipse.finder;bundle-version="[2.0.0,3.0.0)", org.eclipse.swtbot.eclipse.gef.finder;bundle-version="[2.0.0,3.0.0)", @@ -30,7 +31,6 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)", org.eclipse.emf.mwe.core;bundle-version="[1.0.0,2.0.0)", org.eclipse.emf.mwe.utils;bundle-version="[1.0.0,2.0.0)", org.eclipse.emf.cdo.dawn.codegen;bundle-version="[1.0.0,2.0.0)", - org.eclipse.emf.cdo.tests.ui;bundle-version="[4.0.0,5.0.0)", org.eclipse.emf.cdo.dawn.examples.acore.editor;bundle-version="[1.0.0,2.0.0)", org.eclipse.emf.cdo.dawn.examples.acore.diagram;bundle-version="[1.0.0,2.0.0)", org.eclipse.emf.cdo.dawn.codegen.dawngenmodel.gmf.ui;bundle-version="[1.0.0,2.0.0)", diff --git a/plugins/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java b/plugins/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java index 3efea9d0c7..925d277312 100644 --- a/plugins/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java @@ -26,7 +26,7 @@ import java.util.List; /** * This is the item provider adapter for a {@link org.eclipse.emf.cdo.examples.company.Company} object. <!-- * begin-user-doc --> <!-- end-user-doc --> - * + * * @generated */ public class CompanyItemProvider extends AddressableItemProvider diff --git a/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java b/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java index 3efea9d0c7..925d277312 100644 --- a/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java +++ b/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java @@ -26,7 +26,7 @@ import java.util.List; /** * This is the item provider adapter for a {@link org.eclipse.emf.cdo.examples.company.Company} object. <!-- * begin-user-doc --> <!-- end-user-doc --> - * + * * @generated */ public class CompanyItemProvider extends AddressableItemProvider diff --git a/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.gastro.server.web/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.gastro.server.web/META-INF/MANIFEST.MF index e38b462cdd..9a3881f048 100644 --- a/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.gastro.server.web/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.examples.installer/examples/org.gastro.server.web/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CDO Electronic Restaurant Example Server Web Support Bundle-SymbolicName: org.gastro.server.web;singleton:=true -Bundle-Version: 4.1.200.qualifier +Bundle-Version: 4.1.300.qualifier Bundle-Activator: org.gastro.server.internal.web.OM$Activator Bundle-Vendor: Eclipse Modeling Project Require-Bundle: org.apache.commons.logging;bundle-version="[1.1.0,2.0.0)", @@ -16,10 +16,10 @@ Require-Bundle: org.apache.commons.logging;bundle-version="[1.1.0,2.0.0)", org.gastro.business;bundle-version="[4.0.0,5.0.0)", org.gastro.inventory;bundle-version="[4.0.0,5.0.0)" Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Import-Package: javax.servlet;version="[2.3.0,3.0.0)", - javax.servlet.http;version="[2.3.0,3.0.0)", +Import-Package: javax.servlet;version="[2.3.0,4.0.0)", + javax.servlet.http;version="[2.3.0,4.0.0)", org.apache.commons.lang;version="[2.3.0,3.0.0)" Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Export-Package: org.gastro.server.internal.web;version="4.1.200";x-internal:=true, +Export-Package: org.gastro.server.internal.web;version="4.1.300";x-internal:=true, templates;version="4.1.100";x-internal:=true diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.explorer.ui/META-INF/MANIFEST.MF index 72f56d3d3b..3b050a6e2e 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", org.eclipse.ui.navigator;bundle-version="[3.5.0,4.0.0)", org.eclipse.ui.navigator.resources;bundle-version="[3.4.0,4.0.0)", org.eclipse.ui.views.properties.tabbed;bundle-version="[3.5.0,4.0.0)", + org.eclipse.net4j.ui.shared;bundle-version="[4.0.0,5.0.0)", org.eclipse.emf.cdo.explorer;bundle-version="[4.4.0,5.0.0)", org.eclipse.emf.cdo.workspace;bundle-version="[4.0.0,5.0.0)", org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)", diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close.gif b/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close.gif Binary files differnew file mode 100644 index 0000000000..b914f86241 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close.gif diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close_hover.gif b/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close_hover.gif Binary files differnew file mode 100644 index 0000000000..5ba249166b --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close_hover.gif diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java index 46277c7a4e..7c31debabd 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java @@ -51,6 +51,9 @@ public abstract class OM public static final OMPreference<Boolean> PREF_REPOSITORY_TIMEOUT_DISABLED = // PREFS.init("PREF_REPOSITORY_TIMEOUT_DISABLED", false); //$NON-NLS-1$ + public static final OMPreference<Integer> PREF_DASHBOARD_HEIGHT = // + PREFS.init("PREF_DASHBOARD_HEIGHT", 0); //$NON-NLS-1$ + public static Image getOverlayImage(Object image, Object overlayImage, int x, int y) { ComposedImage composedImage = new OverlayImage(image, overlayImage, x, y); diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java index 99a612e1b9..62ef9002f7 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java @@ -177,7 +177,8 @@ public class CDOCheckoutDropAdapterAssistant extends CommonDropAdapterAssistant element = repository.getSession().getBranchManager().getMainBranch(); } } - else if (element instanceof CDOCheckout) + + if (element instanceof CDOCheckout) { CDOCheckout otherCheckout = (CDOCheckout)element; CDOBranchPoint branchPoint = checkout.getBranchPoint(otherCheckout); @@ -186,7 +187,8 @@ public class CDOCheckoutDropAdapterAssistant extends CommonDropAdapterAssistant element = branchPoint; } } - else if (element instanceof CDOBranch) + + if (element instanceof CDOBranch) { CDOBranch branch = (CDOBranch)element; element = branch.getHead(); diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/AbstractActionProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/AbstractActionProvider.java index ad74180def..b3ae6f21ce 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/AbstractActionProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/AbstractActionProvider.java @@ -14,6 +14,7 @@ import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.ui.navigator.CommonActionProvider; import org.eclipse.ui.navigator.ICommonActionExtensionSite; import org.eclipse.ui.navigator.ICommonMenuConstants; @@ -55,6 +56,11 @@ public abstract class AbstractActionProvider<T> extends CommonActionProvider return viewSite; } + public final StructuredViewer getViewer() + { + return config.getStructuredViewer(); + } + public final IStructuredSelection getSelection() { return (IStructuredSelection)getContext().getSelection(); diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/CDOCheckoutDashboard.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/CDOCheckoutDashboard.java new file mode 100644 index 0000000000..f46351fc6a --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/CDOCheckoutDashboard.java @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2004-2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.explorer.ui.checkouts.actions; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; +import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.ui.shared.SharedIcons; +import org.eclipse.emf.cdo.ui.widgets.TimeSlider; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.view.CDOView; + +import org.eclipse.net4j.util.AdapterUtil; +import org.eclipse.net4j.util.ui.widgets.ImageButton; +import org.eclipse.net4j.util.ui.widgets.StackComposite; + +import org.eclipse.emf.ecore.EObject; + +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; +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.Label; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.ISelectionService; +import org.eclipse.ui.IWorkbenchPart; + +import java.util.Iterator; + +/** + * @author Eike Stepper + */ +public class CDOCheckoutDashboard extends Composite implements ISelectionListener +{ + private final ISelectionService selectionService; + + private final Label iconLabel; + + private final Label titleLabel; + + private final ImageButton closeButton; + + private final StackComposite stackComposite; + + private final InfoPage infoPage; + + private final ViewPage viewPage; + + private final TransactionPage transactionPage; + + private DashboardPage currentPage; + + private CDOView currentView; + + public CDOCheckoutDashboard(Composite parent, ISelectionService selectionService) + { + super(parent, SWT.NONE); + this.selectionService = selectionService; + + GridLayout gridLayout = new GridLayout(4, false); + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + setLayout(gridLayout); + + GridData gridData = new GridData(SWT.LEFT, SWT.BOTTOM, false, false); + gridData.heightHint = 21; + + iconLabel = new Label(this, SWT.NONE); + iconLabel.setLayoutData(gridData); + + titleLabel = new Label(this, SWT.NONE); + titleLabel.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false)); + + closeButton = new ImageButton(this, OM.getImage("icons/close_hover.gif"), OM.getImage("icons/close.gif")) + { + @Override + protected void widgetSelected() + { + OM.PREF_DASHBOARD_HEIGHT.setValue(-OM.PREF_DASHBOARD_HEIGHT.getValue()); + CDOCheckoutDashboard.this.dispose(); + } + }; + + closeButton.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false)); + closeButton.setToolTipText("Close"); + + Label space = new Label(this, SWT.NONE); + space.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false)); + + stackComposite = new StackComposite(this, SWT.NONE); + stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1)); + + infoPage = new InfoPage(this); + viewPage = new ViewPage(this); + transactionPage = new TransactionPage(this); + stackComposite.setTopControl(infoPage); + + setSelection(selectionService.getSelection()); + selectionService.addSelectionListener(this); + } + + @Override + public void dispose() + { + selectionService.removeSelectionListener(this); + super.dispose(); + } + + public void selectionChanged(IWorkbenchPart part, ISelection selection) + { + setSelection(selection); + } + + public void setSelection(ISelection selection) + { + DashboardPage oldPage = currentPage; + + CDOView view = getView(selection); + if (view != currentView) + { + currentView = view; + + if (currentView != null) + { + if (isReadOnly(currentView)) + { + transactionPage.setView(null); + currentPage = viewPage; + } + else + { + viewPage.setView(null); + currentPage = transactionPage; + } + + currentPage.setView(currentView); + } + else + { + viewPage.setView(null); + transactionPage.setView(null); + currentPage = infoPage; + } + } + + if (currentPage != oldPage) + { + updateTitleArea(currentPage); + stackComposite.setTopControl(currentPage); + } + } + + private boolean isReadOnly(CDOView view) + { + // Object checkout = view.properties().get(CDOCheckout.class.getName()); + // if (checkout instanceof CDOCheckout) + // { + // return ((CDOCheckout)checkout).isReadOnly(); + // } + + return view.isReadOnly(); + } + + private CDOView getView(ISelection selection) + { + if (selection instanceof IStructuredSelection) + { + IStructuredSelection ssel = (IStructuredSelection)selection; + if (!ssel.isEmpty()) + { + CDOView firstView = null; + for (Iterator<?> it = ssel.iterator(); it.hasNext();) + { + Object element = it.next(); + + CDOCheckout checkout = AdapterUtil.adapt(element, CDOCheckout.class); + if (checkout != null) + { + CDOView view = checkout.getView(); + if (view != null) + { + element = view; + } + } + + EObject eObject = AdapterUtil.adapt(element, EObject.class); + if (eObject != null) + { + CDOObject cdoObject = CDOUtil.getCDOObject(eObject, false); + if (cdoObject != null) + { + CDOView view = cdoObject.cdoView(); + if (view != null) + { + element = view; + } + } + } + + CDOView view = AdapterUtil.adapt(element, CDOView.class); + if (view != null) + { + if (firstView == null) + { + firstView = view; + } + else + { + if (firstView != view) + { + return null; + } + } + } + } + + return firstView; + } + } + + return null; + } + + private StackComposite getStackComposite() + { + return stackComposite; + } + + private void updateTitleArea(DashboardPage page) + { + if (page == currentPage) + { + iconLabel.setImage(page.getIcon()); + titleLabel.setText(page.getTitle()); + } + } + + /** + * @author Eike Stepper + */ + public static abstract class DashboardPage extends Composite + { + private final CDOCheckoutDashboard dashboard; + + private Image icon; + + private String title; + + private CDOView view; + + public DashboardPage(CDOCheckoutDashboard dashboard) + { + super(dashboard.getStackComposite(), SWT.NONE); + this.dashboard = dashboard; + } + + public final Image getIcon() + { + return icon; + } + + public final void setIcon(Image icon) + { + if (this.icon != icon) + { + this.icon = icon; + dashboard.updateTitleArea(this); + } + } + + public final String getTitle() + { + return title; + } + + public final void setTitle(String title) + { + if (this.title != title) + { + this.title = title; + dashboard.updateTitleArea(this); + } + } + + public final CDOView getView() + { + return view; + } + + public final void setView(CDOView view) + { + if (view != this.view) + { + CDOView oldView = this.view; + this.view = view; + viewChanged(oldView, view); + } + } + + protected void viewChanged(CDOView oldView, CDOView newView) + { + } + } + + /** + * @author Eike Stepper + */ + private static class InfoPage extends DashboardPage + { + public InfoPage(CDOCheckoutDashboard dashboard) + { + super(dashboard); + setIcon(org.eclipse.net4j.ui.shared.SharedIcons.getImage(org.eclipse.net4j.ui.shared.SharedIcons.OBJ_INFO)); + setTitle("CDO Dashboard"); + setLayout(new FillLayout()); + + Label label = new Label(this, SWT.WRAP); + label.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE)); + label.setText("This dashboard is context-sensitive. " + + "Select checkouts or models to show view and transaction controls."); + } + } + + /** + * @author Eike Stepper + */ + private static class ViewPage extends DashboardPage + { + private final TimeSlider timeSlider; + + public ViewPage(CDOCheckoutDashboard dashboard) + { + super(dashboard); + setIcon(SharedIcons.getImage(SharedIcons.OBJ_EDITOR_HISTORICAL)); + setTitle("View time:"); + setLayout(new FillLayout()); + + timeSlider = new TimeSlider(this, SWT.HORIZONTAL); + } + + @Override + protected void viewChanged(CDOView oldView, CDOView newView) + { + super.viewChanged(oldView, newView); + // timeSlider.connect(newView, null); + } + } + + /** + * @author Eike Stepper + */ + private static class TransactionPage extends DashboardPage + { + private final Text commentText; + + private final Button promptButton; + + private final Button locksButton; + + public TransactionPage(CDOCheckoutDashboard dashboard) + { + super(dashboard); + setIcon(SharedIcons.getImage(SharedIcons.OBJ_EDITOR)); + setTitle("Transaction commit comment:"); + + GridLayout gridLayout = new GridLayout(2, false); + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + setLayout(gridLayout); + + commentText = new Text(this, SWT.BORDER | SWT.WRAP | SWT.MULTI); + commentText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + + promptButton = new Button(this, SWT.CHECK); + promptButton.setText("Prompt"); + promptButton.setToolTipText("Prompt on commit"); + + locksButton = new Button(this, SWT.CHECK); + locksButton.setText("Release locks"); + locksButton.setToolTipText("Release locks on commit"); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java index 28568a7ae6..db269bd50c 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java @@ -283,7 +283,7 @@ public class OpenWithActionProvider extends CommonActionProvider for (String editorID : editorIDs) { - OpenFileAction action = new OpenFileAction(viewSite.getPage(), resourceLeaf, editorID); + OpenFileAction action = new OpenFileAction(viewSite.getPage(), cdoObject, editorID); submenu.add(action); } @@ -329,7 +329,7 @@ public class OpenWithActionProvider extends CommonActionProvider @Override protected IStatus run(IProgressMonitor monitor) { - final CDOCheckout checkout = CDOExplorerUtil.getCheckout(resourceLeaf); + final CDOCheckout checkout = CDOExplorerUtil.getCheckout(object); final CDOView view = checkout.openView(); final CDOResourceLeaf contextualLeaf = view.getObject(resourceLeaf); diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/ShowInActionProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/ShowInActionProvider.java index 3d38b5f978..712f50f665 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/ShowInActionProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/ShowInActionProvider.java @@ -28,6 +28,7 @@ import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspace; import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.ui.shared.SharedIcons; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.view.CDOView; @@ -42,7 +43,21 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +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.Event; +import org.eclipse.swt.widgets.Layout; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Sash; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; @@ -57,25 +72,40 @@ import java.io.File; */ public class ShowInActionProvider extends AbstractActionProvider<Object> { - private static final String ID = ShowInActionProvider.class.getName(); - public static final String TITLE = "Show In"; + private static final String ID = ShowInActionProvider.class.getName(); + private static final String HISTORY_VIEW_ID = "org.eclipse.team.ui.GenericHistoryView"; + private static final String DASHBOARD_KEY = CDOCheckoutDashboard.class.getName(); + public ShowInActionProvider() { super(Object.class, ID, TITLE, ICommonMenuConstants.GROUP_OPEN); } @Override + public void fillActionBars(IActionBars actionBars) + { + super.fillActionBars(actionBars); + + int dashBoardHeight = OM.PREF_DASHBOARD_HEIGHT.getValue(); + if (dashBoardHeight >= 0) + { + showDashboard(getViewer(), getViewSite().getPage()); + } + } + + @Override protected boolean fillSubMenu(ICommonViewerWorkbenchSite viewSite, IMenuManager subMenu, Object selectedElement) { IWorkbenchPage page = viewSite.getPage(); - return fillMenu(page, subMenu, selectedElement); + StructuredViewer viewer = getViewer(); + return fillMenu(page, viewer, subMenu, selectedElement); } - public static boolean fillMenu(IWorkbenchPage page, IMenuManager menu, Object selectedElement) + public static boolean fillMenu(IWorkbenchPage page, StructuredViewer viewer, IMenuManager menu, Object selectedElement) { boolean filled = false; @@ -108,6 +138,12 @@ public class ShowInActionProvider extends AbstractActionProvider<Object> CDOCheckout checkout = (CDOCheckout)selectedElement; if (checkout.isOpen()) { + if (viewer != null) + { + menu.add(new ShowInDashboardAction(viewer, page)); + filled = true; + } + if (checkout.isOffline()) { OfflineCDOCheckout offlineCheckout = (OfflineCDOCheckout)checkout; @@ -160,13 +196,100 @@ public class ShowInActionProvider extends AbstractActionProvider<Object> return false; } + public static void showDashboard(final StructuredViewer viewer, ISelectionService selectionService) + { + final CDOCheckoutDashboard[] dashboard = { (CDOCheckoutDashboard)viewer.getData(DASHBOARD_KEY) }; + if (dashboard[0] == null) + { + final Control control = viewer.getControl(); + final Object controlLayoutData = control.getLayoutData(); + + final Composite parent = control.getParent(); + final Layout parentLayout = parent.getLayout(); + + final int[] minimumHeight = { 0 }; + + GridLayout layout = new GridLayout(1, false); + layout.marginWidth = 0; + layout.marginHeight = 0; + layout.verticalSpacing = 0; + + parent.setLayout(layout); + control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + final Sash sash = new Sash(parent, SWT.HORIZONTAL | SWT.SMOOTH); + sash.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + sash.addListener(SWT.Selection, new Listener() + { + public void handleEvent(Event e) + { + int dashBoardHeight = parent.getBounds().height - e.y; + if (dashBoardHeight < minimumHeight[0]) + { + e.doit = false; + } + + dashBoardHeight = Math.max(dashBoardHeight, minimumHeight[0]); + OM.PREF_DASHBOARD_HEIGHT.setValue(dashBoardHeight); + + GridData gridData = (GridData)dashboard[0].getLayoutData(); + gridData.heightHint = dashBoardHeight; + + parent.layout(); + } + }); + + GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false); + + dashboard[0] = new CDOCheckoutDashboard(parent, selectionService); + dashboard[0].setLayoutData(gridData); + dashboard[0].addDisposeListener(new DisposeListener() + { + public void widgetDisposed(DisposeEvent e) + { + viewer.setData(DASHBOARD_KEY, null); + if (!control.isDisposed()) + { + sash.dispose(); + + control.setLayoutData(controlLayoutData); + parent.setLayout(parentLayout); + + parent.getDisplay().asyncExec(new Runnable() + { + public void run() + { + parent.layout(); + } + }); + } + } + }); + + viewer.setData(DASHBOARD_KEY, dashboard[0]); + parent.layout(); + + minimumHeight[0] = dashboard[0].getBounds().height; + + int dashBoardHeight = OM.PREF_DASHBOARD_HEIGHT.getValue(); + if (dashBoardHeight != 0) + { + gridData.heightHint = Math.abs(dashBoardHeight); + parent.layout(); + OM.PREF_DASHBOARD_HEIGHT.setValue(gridData.heightHint); + } + else + { + OM.PREF_DASHBOARD_HEIGHT.setValue(minimumHeight[0]); + } + } + } + /** * @author Eike Stepper */ private static final class ShowInServerBrowserAction extends Action { - private static final String ID = OM.BUNDLE_ID + ".ShowInServerBrowserAction"; //$NON-NLS-1$ - private static final String PRODUCT_GROUP = CDOServerBrowser.ContainerBased.Factory.PRODUCT_GROUP; private static final String TYPE = CDOServerBrowser.ContainerBased.Factory.TYPE; @@ -175,12 +298,11 @@ public class ShowInActionProvider extends AbstractActionProvider<Object> private final IManagedContainer container; - private ShowInServerBrowserAction(CDOExplorerElement element, IManagedContainer container) + public ShowInServerBrowserAction(CDOExplorerElement element, IManagedContainer container) { this.element = element; this.container = container; - setId(ID); setText("CDO Server Browser"); setImageDescriptor(OM.getImageDescriptor("icons/web.gif")); setToolTipText("Show this element in a CDO server browser"); @@ -218,10 +340,34 @@ public class ShowInActionProvider extends AbstractActionProvider<Object> /** * @author Eike Stepper */ - private static class ShowInViewAction extends Action + private static final class ShowInDashboardAction extends Action { - private static final String ID_PREFIX = OM.BUNDLE_ID + ".ShowInViewAction"; //$NON-NLS-1$ + private final StructuredViewer viewer; + + private final ISelectionService selectionService; + + public ShowInDashboardAction(StructuredViewer viewer, ISelectionService selectionService) + { + this.viewer = viewer; + this.selectionService = selectionService; + + setText("CDO Dashboard"); + setImageDescriptor(SharedIcons.getDescriptor(SharedIcons.OBJ_EDITOR)); + setToolTipText("Show this element in the CDO dashboard"); + } + + @Override + public void run() + { + showDashboard(viewer, selectionService); + } + } + /** + * @author Eike Stepper + */ + private static class ShowInViewAction extends Action + { private final IWorkbenchPage page; private final IViewDescriptor viewDescriptor; @@ -230,7 +376,6 @@ public class ShowInActionProvider extends AbstractActionProvider<Object> public ShowInViewAction(IWorkbenchPage page, String viewID) { - setId(ID_PREFIX + "." + viewID); this.page = page; viewDescriptor = PlatformUI.getWorkbench().getViewRegistry().find(viewID); @@ -370,15 +515,12 @@ public class ShowInActionProvider extends AbstractActionProvider<Object> */ private static final class ShowInSystemExplorerAction extends Action { - private static final String ID = OM.BUNDLE_ID + ".ShowInSystemExplorerAction"; //$NON-NLS-1$ - private final File folder; private ShowInSystemExplorerAction(File folder) { this.folder = folder; - setId(ID); setText("System Explorer"); setImageDescriptor(OM.getImageDescriptor("icons/system_explorer.gif")); setToolTipText("Show the folder of this element in the system explorer"); diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoriesView.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoriesView.java index a2dee9d7c3..89c1bcc71c 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoriesView.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoriesView.java @@ -222,7 +222,7 @@ public class CDORepositoriesView extends ContainerView IMenuManager subMenu = new MenuManager(ShowInActionProvider.TITLE, ICommonMenuConstants.GROUP_OPEN_WITH); subMenu.add(new GroupMarker(ICommonMenuConstants.GROUP_TOP)); - if (ShowInActionProvider.fillMenu(page, subMenu, selectedElement)) + if (ShowInActionProvider.fillMenu(page, null, subMenu, selectedElement)) { subMenu.add(new GroupMarker(ICommonMenuConstants.GROUP_ADDITIONS)); manager.appendToGroup(ICommonMenuConstants.GROUP_OPEN, subMenu); diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java index 76e36c36a5..0e656266d7 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java @@ -159,6 +159,7 @@ public abstract class CDOCheckoutImpl extends AbstractElement implements CDOChec { this.branchID = branchID; this.timeStamp = timeStamp; + readOnly = timeStamp != CDOBranchPoint.UNSPECIFIED_DATE; if (isOpen()) { diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java index a6cda0125d..3059c4d5a7 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java @@ -200,6 +200,11 @@ public class CDOClientProtocol extends AuthenticatingSignalProtocol<CDOSessionIm return send(new LoadRevisionByVersionRequest(this, id, branchVersion, referenceChunk)); } + public CDOBranchPointRange loadObjectLifetime(CDOID id, CDOBranchPoint branchPoint) + { + return send(new LoadObjectLifetimeRequest(this, id, branchPoint)); + } + public RefreshSessionResult refresh(long lastUpdateTime, Map<CDOBranch, Map<CDOID, InternalCDORevision>> viewedRevisions, int initialChunkSize, boolean enablePassiveUpdates) diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadObjectLifetimeRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadObjectLifetimeRequest.java new file mode 100644 index 0000000000..707147b62e --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadObjectLifetimeRequest.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2009-2012 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.internal.net4j.protocol; + +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.protocol.CDODataInput; +import org.eclipse.emf.cdo.common.protocol.CDODataOutput; +import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.internal.net4j.bundle.OM; +import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; + +import org.eclipse.net4j.util.om.trace.ContextTracer; + +import java.io.IOException; +import java.text.MessageFormat; + +/** + * @author Eike Stepper + */ +public class LoadObjectLifetimeRequest extends CDOClientRequest<CDOBranchPointRange> +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_PROTOCOL, LoadObjectLifetimeRequest.class); + + private CDOID id; + + private CDOBranchPoint branchPoint; + + public LoadObjectLifetimeRequest(CDOClientProtocol protocol, CDOID id, CDOBranchPoint branchPoint) + { + super(protocol, CDOProtocolConstants.SIGNAL_LOAD_OBJECT_LIFETIME); + this.id = id; + this.branchPoint = branchPoint; + } + + @Override + protected void requesting(CDODataOutput out) throws IOException + { + if (TRACER.isEnabled()) + { + TRACER.format("Writing id: {0}", id); //$NON-NLS-1$ + } + + out.writeCDOID(id); + if (TRACER.isEnabled()) + { + TRACER.format("Writing branchPoint: {0}", branchPoint); //$NON-NLS-1$ + } + + out.writeCDOBranchPoint(branchPoint); + } + + @Override + protected CDOBranchPointRange confirming(CDODataInput in) throws IOException + { + if (in.readBoolean()) + { + CDOBranchPoint point1 = in.readCDOBranchPoint(); + CDOBranchPoint point2 = in.readCDOBranchPoint(); + return CDOBranchUtil.createRange(point1, point2); + } + + return null; + } + + @Override + public String toString() + { + return MessageFormat.format("LoadFirstRevisionsRequest(id={0}, branchPoint={1})", id, branchPoint); + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java index 9d29017149..58ebd6abf1 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java @@ -375,6 +375,9 @@ public class CDOServerProtocol extends SignalProtocol<InternalSession> implement case SIGNAL_RENAME_BRANCH: return new RenameBranchIndication(this); + case SIGNAL_LOAD_OBJECT_LIFETIME: + return new LoadObjectLifetimeIndication(this); + default: return super.createSignalReactor(signalID); } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadObjectLifetimeIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadObjectLifetimeIndication.java new file mode 100644 index 0000000000..fbbc01f919 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadObjectLifetimeIndication.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2009-2012 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.server.internal.net4j.protocol; + +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.protocol.CDODataInput; +import org.eclipse.emf.cdo.common.protocol.CDODataOutput; +import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager; + +import org.eclipse.net4j.util.om.trace.ContextTracer; + +import java.io.IOException; + +/** + * @author Eike Stepper + */ +public class LoadObjectLifetimeIndication extends CDOServerReadIndication +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_PROTOCOL, LoadObjectLifetimeIndication.class); + + private CDOID id; + + private CDOBranchPoint branchPoint; + + public LoadObjectLifetimeIndication(CDOServerProtocol protocol) + { + super(protocol, CDOProtocolConstants.SIGNAL_LOAD_OBJECT_LIFETIME); + } + + @Override + protected void indicating(CDODataInput in) throws IOException + { + id = in.readCDOID(); + if (TRACER.isEnabled()) + { + TRACER.format("Read id: {0}", id); //$NON-NLS-1$ + } + + branchPoint = in.readCDOBranchPoint(); + if (TRACER.isEnabled()) + { + TRACER.format("Read branchPoint: {0}", branchPoint); //$NON-NLS-1$ + } + } + + @Override + protected void responding(CDODataOutput out) throws IOException + { + InternalCDORevisionManager revisionManager = getRepository().getRevisionManager(); + CDOBranchPointRange range = revisionManager.getObjectLifetime(id, branchPoint); + if (range != null) + { + out.writeBoolean(true); + out.writeCDOBranchPoint(range.getStartPoint()); + out.writeCDOBranchPoint(range.getEndPoint()); + } + else + { + out.writeBoolean(false); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters index c9af39e940..a1ab5b9aed 100644 --- a/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters @@ -384,6 +384,12 @@ <message_argument value="InternalRepository"/> </message_arguments> </filter> + <filter id="571473929"> + <message_arguments> + <message_argument value="RevisionLoader2"/> + <message_argument value="InternalRepository"/> + </message_arguments> + </filter> </resource> <resource path="src/org/eclipse/emf/cdo/spi/server/InternalSession.java" type="org.eclipse.emf.cdo.spi.server.InternalSession"> <filter id="571473929"> diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java index 893c5a7c90..435d1f8b1d 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java @@ -19,6 +19,7 @@ import org.eclipse.emf.cdo.common.CDOCommonView; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchHandler; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.commit.CDOChangeSetData; import org.eclipse.emf.cdo.common.commit.CDOCommitData; @@ -145,6 +146,10 @@ import java.util.concurrent.Semaphore; */ public class Repository extends Container<Object> implements InternalRepository { + private static final int UNCHUNKED = CDORevision.UNCHUNKED; + + private static final int NONE = CDORevision.DEPTH_NONE; + private String name; private String uuid; @@ -548,7 +553,7 @@ public class Repository extends Container<Object> implements InternalRepository InternalCDORevision target = loadRevisionTarget(id, branchPoint, referenceChunk, accessor); if (target != null) { - if (referenceChunk == CDORevision.UNCHUNKED) + if (referenceChunk == UNCHUNKED) { target.setUnchunked(); } @@ -575,7 +580,7 @@ public class Repository extends Container<Object> implements InternalRepository } else { - if (referenceChunk == CDORevision.UNCHUNKED) + if (referenceChunk == UNCHUNKED) { revision.setUnchunked(); } @@ -610,8 +615,7 @@ public class Repository extends Container<Object> implements InternalRepository private long loadRevisionRevised(CDOID id, CDOBranch branch) { - InternalCDORevision revision = loadRevisionByVersion(id, branch.getVersion(CDORevision.FIRST_VERSION), - CDORevision.UNCHUNKED); + InternalCDORevision revision = loadRevisionByVersion(id, branch.getVersion(CDORevision.FIRST_VERSION), UNCHUNKED); if (revision != null) { return revision.getTimeStamp() - 1; @@ -626,6 +630,80 @@ public class Repository extends Container<Object> implements InternalRepository return accessor.readRevisionByVersion(id, branchVersion, referenceChunk, revisionManager); } + public CDOBranchPointRange loadObjectLifetime(CDOID id, CDOBranchPoint branchPoint) + { + CDORevision revision = revisionManager.getRevision(id, branchPoint, UNCHUNKED, NONE, true); + if (revision == null) + { + return null; + } + + CDORevision firstRevision = getFirstRevision(id, revision); + if (firstRevision == null) + { + return null; + } + + CDOBranchPoint lastPoint = getLastBranchPoint(revision, branchPoint); + return CDOBranchUtil.createRange(firstRevision, lastPoint); + } + + private CDORevision getFirstRevision(CDOID id, CDORevision revision) + { + CDOBranch branch = revision.getBranch(); + + for (int version = revision.getVersion() - 1; version >= CDOBranchVersion.FIRST_VERSION; --version) + { + CDORevision rev = revisionManager.getRevisionByVersion(id, branch.getVersion(version), UNCHUNKED, true); + if (rev == null) + { + return revision; + } + + revision = rev; + } + + if (!branch.isMainBranch()) + { + CDOBranchPoint base = branch.getBase(); + CDORevision baseRevision = revisionManager.getRevision(id, base, UNCHUNKED, NONE, true); + if (baseRevision != null) + { + return getFirstRevision(id, baseRevision); + } + } + + return revision; + } + + private CDOBranchPoint getLastBranchPoint(CDORevision revision, CDOBranchPoint branchPoint) + { + CDOBranch branch = branchPoint.getBranch(); + if (revision.getBranch() != branch) + { + return branch.getHead(); + } + + CDOID id = revision.getID(); + for (int version = revision.getVersion() + 1; version <= Integer.MAX_VALUE; ++version) + { + if (revision.getRevised() == CDOBranchPoint.UNSPECIFIED_DATE) + { + break; + } + + CDORevision rev = revisionManager.getRevisionByVersion(id, branch.getVersion(version), UNCHUNKED, true); + if (rev == null) + { + break; + } + + revision = rev; + } + + return branch.getPoint(revision.getRevised()); + } + /** * @deprecated Not used. */ @@ -645,7 +723,7 @@ public class Repository extends Container<Object> implements InternalRepository public void ensureChunks(InternalCDORevision revision) { - ensureChunks(revision, CDORevision.UNCHUNKED); + ensureChunks(revision, UNCHUNKED); } public void ensureChunks(InternalCDORevision revision, int chunkSize) @@ -666,7 +744,7 @@ public class Repository extends Container<Object> implements InternalRepository if (size != 0) { int chunkSizeToUse = chunkSize; - if (chunkSizeToUse == CDORevision.UNCHUNKED) + if (chunkSizeToUse == UNCHUNKED) { chunkSizeToUse = size; } @@ -1533,7 +1611,7 @@ public class Repository extends Container<Object> implements InternalRepository private InternalCDORevision getRevisionFromBranch(CDOID id, CDOBranchPoint branchPoint) { - return revisionManager.getRevision(id, branchPoint, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); + return revisionManager.getRevision(id, branchPoint, UNCHUNKED, NONE, true); } public void queryLobs(List<byte[]> ids) @@ -1686,8 +1764,7 @@ public class Repository extends Container<Object> implements InternalRepository for (CDORevisionKey revKey : revisionKeys) { CDOID id = revKey.getID(); - InternalCDORevision rev = revManager.getRevision(id, viewedBranch.getHead(), CDORevision.UNCHUNKED, - CDORevision.DEPTH_NONE, true); + InternalCDORevision rev = revManager.getRevision(id, viewedBranch.getHead(), UNCHUNKED, NONE, true); if (rev == null) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java index 94644c81a5..fe260e22d4 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java @@ -225,6 +225,11 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi } } + public CDOBranchPointRange loadObjectLifetime(CDOID id, CDOBranchPoint branchPoint) + { + throw new UnsupportedOperationException(); + } + public List<RevisionInfo> loadRevisions(List<RevisionInfo> infos, CDOBranchPoint branchPoint, int referenceChunk, int prefetchDepth) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java index 38f3b45ee3..4584ac1e07 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java @@ -38,7 +38,7 @@ import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry.PackagePr import org.eclipse.emf.cdo.spi.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager.RevisionLoader; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager.RevisionLoader2; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; import org.eclipse.net4j.util.container.IManagedContainer; @@ -65,7 +65,7 @@ import java.util.concurrent.Semaphore; * @noimplement This interface is not intended to be implemented by clients. */ public interface InternalRepository extends IRepository, PackageProcessor, PackageLoader, BranchLoader3, - RevisionLoader, CommitInfoLoader, CDORevisionUnchunker + RevisionLoader2, CommitInfoLoader, CDORevisionUnchunker { public void setName(String name); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java index 964b7cd15f..5888720759 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java @@ -15,10 +15,12 @@ import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchChangedEvent; import org.eclipse.emf.cdo.common.branch.CDOBranchManager; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; +import org.eclipse.emf.cdo.common.revision.CDORevisionManager; import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.internal.common.revision.AbstractCDORevisionCache; @@ -28,6 +30,7 @@ import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.tests.config.IRepositoryConfig; import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires; +import org.eclipse.emf.cdo.tests.model1.Company; import org.eclipse.emf.cdo.tests.model1.OrderDetail; import org.eclipse.emf.cdo.tests.model1.Product1; import org.eclipse.emf.cdo.transaction.CDOTransaction; @@ -1101,6 +1104,42 @@ public class BranchingTest extends AbstractCDOTest assertEquals(true, subBranch.getBase().getTimeStamp() < future); } + public void testObjectLifetime() throws Exception + { + Company company = getModel1Factory().createCompany(); + + CDOSession session = openSession1(); + CDOTransaction transaction = session.openTransaction(); + CDOResource resource = transaction.createResource(getResourcePath("test")); + resource.getContents().add(company); + CDOCommitInfo firstCommit = transaction.commit(); + + modifyCompany(transaction, company, getBranchName("sub1")); + modifyCompany(transaction, company, getBranchName("sub2")); + CDOBranch sub3 = modifyCompany(transaction, company, getBranchName("sub3")); + + CDOID id = CDOUtil.getCDOObject(company).cdoID(); + CDOBranchPoint branchPoint = sub3.getHead(); + CDORevisionManager revisionManager = session.getRevisionManager(); + CDOBranchPointRange lifetime = revisionManager.getObjectLifetime(id, branchPoint); + + assertEquals(firstCommit, lifetime.getStartPoint()); + assertEquals(sub3.getHead(), lifetime.getEndPoint()); + } + + private CDOBranch modifyCompany(CDOTransaction transaction, Company company, String branchName) throws Exception + { + for (int i = 0; i < 10; i++) + { + company.setName("Company" + i); + transaction.commit(); + } + + CDOBranch branch = transaction.getBranch().createBranch(branchName); + transaction.setBranch(branch); + return branch; + } + private void check(CDOSession session, CDOBranch branch, long timeStamp, String name) { CDOView view = session.openView(branch, timeStamp); diff --git a/plugins/org.eclipse.emf.cdo.ui/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.ui/.settings/.api_filters index b7ef41db0b..79baef5146 100644 --- a/plugins/org.eclipse.emf.cdo.ui/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.ui/.settings/.api_filters @@ -1524,4 +1524,12 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/cdo/ui/widgets/TimeSlider.java" type="org.eclipse.emf.cdo.ui.widgets.TimeSlider"> + <filter id="571473929"> + <message_arguments> + <message_argument value="Scale"/> + <message_argument value="TimeSlider"/> + </message_arguments> + </filter> + </resource> </component> diff --git a/plugins/org.eclipse.emf.cdo.ui/CDOClient1.launch b/plugins/org.eclipse.emf.cdo.ui/CDOClient1.launch index 6e0233741c..6d2960c051 100644 --- a/plugins/org.eclipse.emf.cdo.ui/CDOClient1.launch +++ b/plugins/org.eclipse.emf.cdo.ui/CDOClient1.launch @@ -1,5 +1,9 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench"> +<setAttribute key="additional_plugins"> +<setEntry value="javax.servlet:3.0.0.v201112011016:default:false"/> +<setEntry value="javax.servlet:3.1.0.v201410161800:default:false"/> +</setAttribute> <booleanAttribute key="append.args" value="true"/> <booleanAttribute key="askclear" value="true"/> <booleanAttribute key="automaticAdd" value="false"/> @@ -11,6 +15,8 @@ <booleanAttribute key="clearwslog" value="false"/> <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/CDOClient1"/> <booleanAttribute key="default" value="true"/> +<stringAttribute key="featureDefaultLocation" value="workspace"/> +<stringAttribute key="featurePluginResolution" value="workspace"/> <booleanAttribute key="includeOptional" value="true"/> <stringAttribute key="location" value="${workspace_loc}/../ws-cdo.client1"/> <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> @@ -23,11 +29,68 @@ <listEntry value="org.eclipse.debug.ui.launchGroup.run"/> </listAttribute> <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> -<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -nosplash -console -clean"/> +<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -nosplash -clean"/> <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/> <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:MaxPermSize=512m -Xms40m -Xmx1g -Dosgi.console.enable.builtin=true -Dosgi.checkConfiguration=false"/> <stringAttribute key="pde.version" value="3.3"/> <stringAttribute key="product" value="org.eclipse.platform.ide"/> +<setAttribute key="selected_features"> +<setEntry value="org.eclipse.e4.rcp:default"/> +<setEntry value="org.eclipse.ecf.core.feature:default"/> +<setEntry value="org.eclipse.ecf.core.ssl.feature:default"/> +<setEntry value="org.eclipse.ecf.filetransfer.feature:default"/> +<setEntry value="org.eclipse.ecf.filetransfer.httpclient4.feature:default"/> +<setEntry value="org.eclipse.ecf.filetransfer.httpclient4.ssl.feature:default"/> +<setEntry value="org.eclipse.ecf.filetransfer.ssl.feature:default"/> +<setEntry value="org.eclipse.emf.cdo.compare:default"/> +<setEntry value="org.eclipse.emf.cdo.doc:default"/> +<setEntry value="org.eclipse.emf.cdo.epp:default"/> +<setEntry value="org.eclipse.emf.cdo.examples:default"/> +<setEntry value="org.eclipse.emf.cdo.explorer:default"/> +<setEntry value="org.eclipse.emf.cdo.license:default"/> +<setEntry value="org.eclipse.emf.cdo.migrator:default"/> +<setEntry value="org.eclipse.emf.cdo.server.db:default"/> +<setEntry value="org.eclipse.emf.cdo.server:default"/> +<setEntry value="org.eclipse.emf.cdo:default"/> +<setEntry value="org.eclipse.emf.common:default"/> +<setEntry value="org.eclipse.emf.ecore:default"/> +<setEntry value="org.eclipse.emf.ecp.emfforms.runtime.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.categorization.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.compoundcontrol.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.custom.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.group.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.horizontal.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.label.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.rule.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.stack.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.table.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.template.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.treemasterdetail.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.unset.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.validation.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.view.vertical.feature:default"/> +<setEntry value="org.eclipse.emf.ecp.viewmodel.feature:default"/> +<setEntry value="org.eclipse.equinox.executable:default"/> +<setEntry value="org.eclipse.equinox.p2.core.feature:default"/> +<setEntry value="org.eclipse.equinox.p2.extras.feature:default"/> +<setEntry value="org.eclipse.equinox.p2.rcp.feature:default"/> +<setEntry value="org.eclipse.equinox.p2.user.ui:default"/> +<setEntry value="org.eclipse.help:default"/> +<setEntry value="org.eclipse.jdt:default"/> +<setEntry value="org.eclipse.net4j.db.doc:default"/> +<setEntry value="org.eclipse.net4j.db.h2:default"/> +<setEntry value="org.eclipse.net4j.db:default"/> +<setEntry value="org.eclipse.net4j.doc:default"/> +<setEntry value="org.eclipse.net4j.sdk:default"/> +<setEntry value="org.eclipse.net4j.ui:default"/> +<setEntry value="org.eclipse.net4j.util.doc:default"/> +<setEntry value="org.eclipse.net4j.util.ui:default"/> +<setEntry value="org.eclipse.net4j.util:default"/> +<setEntry value="org.eclipse.net4j:default"/> +<setEntry value="org.eclipse.pde:default"/> +<setEntry value="org.eclipse.platform:default"/> +<setEntry value="org.eclipse.rcp:default"/> +</setAttribute> <stringAttribute key="selected_target_plugins" value="com.google.guava@default:default,com.ibm.icu@default:default,javax.servlet@default:default,org.apache.lucene.analysis@default:default,org.apache.lucene.core@default:default,org.apache.lucene.highlighter@default:default,org.apache.lucene.memory@default:default,org.apache.lucene.misc@default:default,org.apache.lucene.queries@default:default,org.apache.lucene.snowball@default:default,org.apache.lucene.spellchecker@default:default,org.apache.lucene@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.win32.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.win32.x86_64@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.emf.common.ui@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.compare@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit.ui@default:default,org.eclipse.emf.edit@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.win32.x86_64@default:false,org.eclipse.equinox.security@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.platform@default:default,org.eclipse.swt.win32.win32.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.ui@default:default,org.eclipse.text@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.net@default:default,org.eclipse.ui.trace@default:default,org.eclipse.ui.views.log@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.win32@default:false,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.h2@default:default"/> <stringAttribute key="selected_workspace_plugins" value="org.eclipse.emf.cdo.admin@default:default,org.eclipse.emf.cdo.common@default:default,org.eclipse.emf.cdo.compare@default:default,org.eclipse.emf.cdo.edit@default:default,org.eclipse.emf.cdo.examples.company.edit@default:default,org.eclipse.emf.cdo.examples.company@default:default,org.eclipse.emf.cdo.location@default:default,org.eclipse.emf.cdo.net4j@default:default,org.eclipse.emf.cdo.security.edit@default:default,org.eclipse.emf.cdo.security.editor@default:default,org.eclipse.emf.cdo.security@default:default,org.eclipse.emf.cdo.team@default:default,org.eclipse.emf.cdo.transfer.repository@default:default,org.eclipse.emf.cdo.transfer.ui@default:default,org.eclipse.emf.cdo.transfer.workspace.ui@default:default,org.eclipse.emf.cdo.transfer.workspace@default:default,org.eclipse.emf.cdo.transfer@default:default,org.eclipse.emf.cdo.ui.admin@default:default,org.eclipse.emf.cdo.ui.efs@default:default,org.eclipse.emf.cdo.ui.ide@default:default,org.eclipse.emf.cdo.ui.location@default:default,org.eclipse.emf.cdo.ui.shared@default:default,org.eclipse.emf.cdo.ui@default:default,org.eclipse.emf.cdo@default:default,org.eclipse.net4j.db.h2@default:default,org.eclipse.net4j.db@default:default,org.eclipse.net4j.jvm@default:default,org.eclipse.net4j.tcp@default:default,org.eclipse.net4j.ui.shared@default:default,org.eclipse.net4j.ui@default:default,org.eclipse.net4j.util.ui@default:default,org.eclipse.net4j.util@default:default,org.eclipse.net4j@default:default"/> <booleanAttribute key="show_selected_only" value="false"/> diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java index 08914412d1..030f4fe7fe 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.internal.ui.editor; import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; @@ -24,12 +25,13 @@ import org.eclipse.emf.cdo.internal.ui.bundle.OM; import org.eclipse.emf.cdo.internal.ui.dialogs.BulkAddDialog; import org.eclipse.emf.cdo.internal.ui.dialogs.RollbackTransactionDialog; import org.eclipse.emf.cdo.internal.ui.messages.Messages; -import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.ui.CDOEditorInput; import org.eclipse.emf.cdo.ui.CDOEventHandler; import org.eclipse.emf.cdo.ui.CDOLabelProvider; import org.eclipse.emf.cdo.ui.shared.SharedIcons; +import org.eclipse.emf.cdo.ui.widgets.TimeSlider; import org.eclipse.emf.cdo.util.CDOURIUtil; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.ValidationException; @@ -115,11 +117,9 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; -import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; @@ -130,8 +130,6 @@ import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; @@ -139,7 +137,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IActionBars; @@ -173,14 +170,10 @@ import java.util.Collections; import java.util.Comparator; import java.util.EventObject; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; -//import org.eclipse.emf.cdo.internal.ui.editor.provider.CDOItemProviderAdapterFactory; -//import org.eclipse.core.runtime.NullProgressMonitor; /** * @author Eike Stepper @@ -1209,17 +1202,63 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv // Create a page for the selection tree view. getContainer().setLayoutData(UIUtil.createGridData()); getContainer().setLayout(UIUtil.createGridLayout(1)); - Composite composite = UIUtil.createGridComposite(getContainer(), 1); + + final Composite composite = UIUtil.createGridComposite(getContainer(), 1); composite.setLayoutData(UIUtil.createGridData()); composite.setLayout(UIUtil.createGridLayout(1)); + Tree tree = new Tree(composite, SWT.MULTI); tree.setLayoutData(UIUtil.createGridData()); - final Set<CDOID> expandedIDs = new HashSet<CDOID>(); - final boolean sliderAllowed = view.isReadOnly() && view.getSession().getRepositoryInfo().isSupportingAudits(); - if (sliderAllowed) + final boolean timeSliderAllowed = view.isReadOnly() && view.getSession().getRepositoryInfo().isSupportingAudits(); + if (timeSliderAllowed) { - createTimeSlider(composite, expandedIDs); + IAction toolbarToggleAction = new Action() + { + private Group group; + + private TimeSlider timeSlider; + + @Override + public void run() + { + if (group == null) + { + group = new Group(composite, SWT.NONE); + group.setLayoutData(new GridData(SWT.FILL, 50, true, false)); + group.setLayout(new FillLayout()); + group.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); + + timeSlider = new TimeSlider(group, SWT.HORIZONTAL) + { + @Override + protected void timeStampChanged(long timeStamp) + { + super.timeStampChanged(timeStamp); + group.setText(formatTimeSliderLabel(timeStamp)); + } + }; + + timeSlider.connect(view, selectionViewer); + group.setText(formatTimeSliderLabel(timeSlider.getTimeStamp())); + } + else + { + timeSlider.disconnect(); + group.dispose(); + group = null; + timeSlider = null; + } + + composite.layout(); + } + }; + + toolbarToggleAction.setEnabled(true); + toolbarToggleAction.setChecked(false); + toolbarToggleAction.setImageDescriptor(SharedIcons.getDescriptor(SharedIcons.ETOOL_SLIDER)); + toolbarToggleAction.setToolTipText(Messages.getString("CDOEditor.1")); //$NON-NLS-1$ + getActionBars().getToolBarManager().add(toolbarToggleAction); } selectionViewer = new TreeViewer(tree) @@ -1227,7 +1266,7 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv @Override public void setSelection(ISelection selection, boolean reveal) { - if (sliderAllowed && selection instanceof IStructuredSelection) + if (timeSliderAllowed && selection instanceof IStructuredSelection) { IStructuredSelection ssel = (IStructuredSelection)selection; for (Iterator<?> it = ssel.iterator(); it.hasNext();) @@ -1258,38 +1297,6 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv } }; - selectionViewer.addTreeListener(new ITreeViewerListener() - { - public void treeExpanded(TreeExpansionEvent event) - { - CDOID id = getID(event.getElement()); - if (id != null) - { - expandedIDs.add(id); - } - } - - public void treeCollapsed(TreeExpansionEvent event) - { - CDOID id = getID(event.getElement()); - if (id != null) - { - expandedIDs.remove(id); - } - } - - protected CDOID getID(Object element) - { - if (element instanceof EObject) - { - CDOObject object = CDOUtil.getCDOObject((EObject)element); - return object.cdoID(); - } - - return null; - } - }); - setCurrentViewer(selectionViewer); selectionViewer.setContentProvider(createContentProvider()); @@ -1445,89 +1452,10 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv }); } - /** - * @ADDED - */ - protected void createTimeSlider(final Composite composite, final Set<CDOID> expandedIDs) + protected String formatTimeSliderLabel(long timeStamp) { - final CDOSession session = view.getSession(); - final long startTimeStamp = session.getRepositoryInfo().getCreationTime(); - final long endTimeStamp = session.getLastUpdateTime(); - - final int MIN = 0; - final int MAX = 100000; - final long absoluteTimeWindowLength = endTimeStamp - startTimeStamp; - final long scaleFactor = MAX - MIN; - final double stepSize = (double)absoluteTimeWindowLength / (double)scaleFactor; - - final Group group = new Group(composite, SWT.NONE); - group.setLayoutData(UIUtil.createEmptyGridData()); - group.setLayout(new FillLayout()); - group.setText(CDOCommonUtil.formatTimeStamp(endTimeStamp)); - group.setVisible(false); - - final Scale scale = new Scale(group, SWT.HORIZONTAL); - scale.setMinimum(MIN); - scale.setMaximum(MAX); - scale.setSelection(MAX); - - scale.addSelectionListener(new SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent e) - { - long value = scale.getSelection(); - long timeStamp = startTimeStamp + Math.round(stepSize * value); - - group.setText(CDOCommonUtil.formatTimeStamp(timeStamp)); - - view.setTimeStamp(timeStamp); - selectionViewer.refresh(); - setExpandedStates(); - } - - protected void setExpandedStates() - { - for (CDOID id : expandedIDs) - { - try - { - CDOObject object = view.getObject(id); - selectionViewer.setExpandedState(object, true); - } - catch (Exception ex) - { - // Ignore - } - } - } - }); - - IAction action = new Action() - { - @Override - public void run() - { - if (group.isVisible()) - { - group.setVisible(false); - group.setLayoutData(UIUtil.createEmptyGridData()); - composite.layout(); - } - else - { - group.setVisible(true); - group.setLayoutData(new GridData(SWT.FILL, 50, true, false)); - composite.layout(); - } - } - }; - - action.setEnabled(true); - action.setChecked(false); - action.setImageDescriptor(SharedIcons.getDescriptor(SharedIcons.ETOOL_SLIDER)); - action.setToolTipText(Messages.getString("CDOEditor.1")); //$NON-NLS-1$ - getActionBars().getToolBarManager().add(action); + CDOBranchPoint branchPoint = CDOBranchUtil.normalizeBranchPoint(view.getBranch(), timeStamp); + return branchPoint.getBranch().getPathName() + " [" + CDOCommonUtil.formatTimeStamp(timeStamp) + "]"; } /** diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/widgets/TimeSlider.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/widgets/TimeSlider.java new file mode 100644 index 0000000000..eae38c27af --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/widgets/TimeSlider.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2004-2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.ui.widgets; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.view.CDOStaleReferencePolicy; +import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.emf.cdo.view.CDOViewTargetChangedEvent; + +import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.event.IListener; + +import org.eclipse.emf.ecore.EObject; + +import org.eclipse.jface.viewers.ITreeViewerListener; +import org.eclipse.jface.viewers.TreeExpansionEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Scale; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author Eike Stepper + * @since 4.4 + */ +public class TimeSlider extends Scale implements IListener, ITreeViewerListener +{ + private static final int MIN = 0; + + private static final int MAX = 100000; + + private static final double FACTOR = MAX - MIN; + + private final Set<CDOID> expandedIDs = new HashSet<CDOID>(); + + private long startTimeStamp; + + private long endTimeStamp; + + private long absoluteTimeWindowLength; + + private double stepSize; + + private long timeStamp; + + private CDOStaleReferencePolicy.DynamicProxy.Enhanced staleReferencePolicy; + + private CDOView view; + + private TreeViewer viewer; + + public TimeSlider(Composite parent, int style) + { + super(parent, style); + setMinimum(MIN); + setMaximum(MAX); + setSelection(MAX); + setPageIncrement(MAX - MIN); + + addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent e) + { + long value = getSelection(); + long timeStamp = startTimeStamp + Math.round(stepSize * value); + setTimeStamp(timeStamp); + + viewer.refresh(); + setExpandedStates(); + } + + protected void setExpandedStates() + { + for (CDOID id : expandedIDs) + { + try + { + CDOObject object = view.getObject(id); + viewer.setExpandedState(object, true); + } + catch (Exception ex) + { + // Ignore + } + } + } + }); + } + + public final long getTimeStamp() + { + return timeStamp; + } + + public void setTimeStamp(long timeStamp) + { + if (timeStamp == CDOBranchPoint.UNSPECIFIED_DATE) + { + timeStamp = endTimeStamp; + } + else if (timeStamp < startTimeStamp) + { + timeStamp = startTimeStamp; + } + else if (timeStamp > endTimeStamp) + { + timeStamp = endTimeStamp; + } + + if (this.timeStamp != timeStamp) + { + this.timeStamp = timeStamp; + timeStampChanged(timeStamp); + } + } + + public void connect(CDOView view, TreeViewer viewer) + { + disconnect(); + + this.view = view; + this.viewer = viewer; + + for (Object element : viewer.getExpandedElements()) + { + CDOID id = getID(element); + if (id != null) + { + expandedIDs.add(id); + } + } + + viewer.addTreeListener(this); + + CDOObject input = CDOUtil.getCDOObject((EObject)viewer.getInput()); + CDOBranchPointRange lifetime = CDOUtil.getLifetime(input); + + startTimeStamp = lifetime.getStartPoint().getTimeStamp(); + endTimeStamp = lifetime.getEndPoint().getTimeStamp(); + if (endTimeStamp == CDOBranchPoint.UNSPECIFIED_DATE) + { + CDOSession session = view.getSession(); + endTimeStamp = session.getLastUpdateTime(); + } + + absoluteTimeWindowLength = endTimeStamp - startTimeStamp; + stepSize = absoluteTimeWindowLength / FACTOR; + + setTimeStamp(endTimeStamp); + + staleReferencePolicy = new CDOStaleReferencePolicy.DynamicProxy.Enhanced(view); + view.addListener(this); + } + + public void disconnect() + { + if (staleReferencePolicy != null) + { + view.removeListener(this); + staleReferencePolicy.dispose(); + staleReferencePolicy = null; + + expandedIDs.clear(); + viewer.removeTreeListener(this); + + viewer = null; + view = null; + } + } + + public void notifyEvent(IEvent event) + { + if (event instanceof CDOViewTargetChangedEvent) + { + CDOViewTargetChangedEvent e = (CDOViewTargetChangedEvent)event; + setTimeStamp(e.getBranchPoint().getTimeStamp()); + } + } + + public void treeExpanded(TreeExpansionEvent event) + { + CDOID id = getID(event.getElement()); + if (id != null) + { + expandedIDs.add(id); + } + } + + public void treeCollapsed(TreeExpansionEvent event) + { + CDOID id = getID(event.getElement()); + if (id != null) + { + expandedIDs.remove(id); + } + } + + @Override + public void dispose() + { + disconnect(); + super.dispose(); + } + + protected void timeStampChanged(long timeStamp) + { + view.setTimeStamp(timeStamp); + } + + @Override + protected void checkSubclass() + { + // Allow overriding. + } + + private CDOID getID(Object element) + { + if (element instanceof EObject) + { + CDOObject object = CDOUtil.getCDOObject((EObject)element, false); + if (object != null) + { + return object.cdoID(); + } + } + + return null; + } +} diff --git a/plugins/org.eclipse.emf.cdo/.settings/.api_filters b/plugins/org.eclipse.emf.cdo/.settings/.api_filters index dca11508f1..359c929b3b 100644 --- a/plugins/org.eclipse.emf.cdo/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo/.settings/.api_filters @@ -217,14 +217,6 @@ </message_arguments> </filter> </resource> - <resource path="src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java" type="org.eclipse.emf.cdo.view.CDOStaleReferencePolicy"> - <filter id="403767336"> - <message_arguments> - <message_argument value="org.eclipse.emf.cdo.view.CDOStaleReferencePolicy"/> - <message_argument value="DEFAULT"/> - </message_arguments> - </filter> - </resource> <resource path="src/org/eclipse/emf/cdo/view/CDOView.java" type="org.eclipse.emf.cdo.view.CDOView"> <filter id="571473929"> <message_arguments> @@ -704,6 +696,12 @@ <message_argument value="CDOSessionProtocol"/> </message_arguments> </filter> + <filter id="571473929"> + <message_arguments> + <message_argument value="RevisionLoader2"/> + <message_argument value="CDOSessionProtocol"/> + </message_arguments> + </filter> </resource> <resource path="src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java" type="org.eclipse.emf.spi.cdo.CDOSessionProtocol$CommitTransactionResult"> <filter id="574619656"> diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java index a0cff26a76..9939c16480 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java @@ -16,7 +16,9 @@ import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.common.CDOCommonRepository; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange; import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionManager; import org.eclipse.emf.cdo.common.security.CDOPermission; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.eresource.CDOResourceFactory; @@ -552,6 +554,15 @@ public final class CDOUtil } /** + * @since 4.4 + */ + public static CDOBranchPointRange getLifetime(CDOObject object) + { + CDORevisionManager revisionManager = object.cdoView().getSession().getRevisionManager(); + return revisionManager.getObjectLifetime(object.cdoID(), object.cdoRevision()); + } + + /** * @since 2.0 */ public static CDORevision getRevisionByVersion(CDOObject object, int version) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java index 4cea4498b6..fb1a807c89 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java @@ -11,25 +11,35 @@ */ package org.eclipse.emf.cdo.view; +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.CDOState; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.ObjectNotFoundException; +import org.eclipse.emf.cdo.view.CDOView.Options; import org.eclipse.emf.internal.cdo.bundle.OM; import org.eclipse.emf.internal.cdo.messages.Messages; import org.eclipse.net4j.util.om.trace.ContextTracer; +import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notifier; +import org.eclipse.emf.common.notify.impl.BasicNotifierImpl.EAdapterList; +import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; +import org.eclipse.emf.spi.cdo.InternalCDOObject; +import org.eclipse.emf.spi.cdo.InternalCDOView; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * Specifies a policy on how to deal with stale references. @@ -40,7 +50,7 @@ import java.util.Arrays; public interface CDOStaleReferencePolicy { /** - * A default stale reference policy. It will throw an exception each time. + * A stale reference policy that throws an {@link ObjectNotFoundException} each time. */ public static final CDOStaleReferencePolicy EXCEPTION = new CDOStaleReferencePolicy() { @@ -57,33 +67,44 @@ public interface CDOStaleReferencePolicy }; /** - * Returns a proxy object with the appropriate EClass. The proxy object supports the following methods: - * <ul> - * <li> - * {@link CDOStaleObject#cdoID()} - * <li> - * {@link InternalEObject#eClass()} - * <li> - * {@link InternalEObject#eIsProxy()} - * <li> - * {@link Notifier#eAdapters()} - * </ul> - * For all invocations of other methods the proxy object throws an {@link ObjectNotFoundException}. The receiver can - * use {@link CDOUtil#isStaleObject(Object)} or <code>instanceof {@link CDOStaleObject}</code> to detect proxy objects. + * A stale reference policy that returns dynamic Java proxies with the appropriate EClasses. */ - public static final CDOStaleReferencePolicy PROXY = new CDOStaleReferencePolicy() + public static final CDOStaleReferencePolicy PROXY = new DynamicProxy(); + + /** + * @since 4.2 + */ + public static final CDOStaleReferencePolicy DEFAULT = PROXY; + + /** + * Returns an object that we want to return to the caller (clients). Exception thrown will be received by the caller + * (clients). + */ + public Object processStaleReference(EObject source, EStructuralFeature feature, int index, CDOID target); + + /** + * @author Eike Stepper + * @since 4.4 + */ + public static class DynamicProxy implements CDOStaleReferencePolicy { - private final ContextTracer tracer = new ContextTracer(OM.DEBUG, CDOStaleReferencePolicy.class); + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOStaleReferencePolicy.class); public Object processStaleReference(final EObject source, final EStructuralFeature feature, int index, final CDOID target) { - final EClassifier type = feature.getEType(); + final EClassifier type = getType(source, feature, index, target); InvocationHandler handler = new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String name = method.getName(); + + if (TRACER.isEnabled()) + { + TRACER.trace("Proxy invocation: " + target + "." + name + (args == null ? "()" : Arrays.asList(args))); + } + if (name.equals("cdoID")) //$NON-NLS-1$ { return target; @@ -101,7 +122,7 @@ public interface CDOStaleReferencePolicy if (name.equals("eAdapters")) //$NON-NLS-1$ { - return source.eAdapters(); + return new EAdapterList<Adapter>((Notifier)proxy); } if (name.equals("eContainer")) //$NON-NLS-1$ @@ -114,7 +135,38 @@ public interface CDOStaleReferencePolicy return null; } - if (name.equals("equals")) //$NON-NLS-1$ + if (name.equals("eInvoke")) //$NON-NLS-1$ + { + return null; + } + + if (name.equals("eGet") && args != null && args.length >= 1) //$NON-NLS-1$ + { + EStructuralFeature featureParam = (EStructuralFeature)args[0]; + if (featureParam.isMany()) + { + return new BasicEList<Object>(); + } + + return featureParam.getDefaultValue(); + } + + if (name.equals("eIsSet")) //$NON-NLS-1$ + { + return false; + } + + if (name.equals("eSet")) //$NON-NLS-1$ + { + return null; + } + + if (name.equals("eUnset")) //$NON-NLS-1$ + { + return null; + } + + if (name.equals("equals") && args != null && args.length == 1) //$NON-NLS-1$ { return target.equals(args[0]); } @@ -129,12 +181,54 @@ public interface CDOStaleReferencePolicy return "StaleReference[" + type.getName() + "@" + target + "]"; } - if (tracer.isEnabled()) + Class<?> returnType = method.getReturnType(); + if (returnType == null || returnType == void.class) { - tracer.trace("Illegal proxy invocation: " + target + "." + method.getName() + Arrays.asList(args)); + return null; } - throw new ObjectNotFoundException(target); + if (returnType.isPrimitive()) + { + if (returnType == boolean.class) + { + return false; + } + else if (returnType == char.class) + { + return (char)0; + } + else if (returnType == byte.class) + { + return (byte)0; + } + else if (returnType == short.class) + { + return (short)0; + } + else if (returnType == int.class) + { + return (int)0; + } + else if (returnType == long.class) + { + return (long)0; + } + else if (returnType == float.class) + { + return (float)0; + } + else if (returnType == double.class) + { + return (double)0; + } + } + + if (List.class.isAssignableFrom(returnType)) + { + return new BasicEList<Object>(); + } + + return null; } }; @@ -154,21 +248,74 @@ public interface CDOStaleReferencePolicy return Proxy.newProxyInstance(instanceClass.getClassLoader(), interfaces, handler); } + protected EClassifier getType(EObject source, EStructuralFeature feature, int index, CDOID target) + { + return feature.getEType(); + } + @Override public String toString() { return Messages.getString("CDOStaleReferencePolicy.1"); //$NON-NLS-1$ } - }; - /** - * @since 4.2 - */ - public static final CDOStaleReferencePolicy DEFAULT = PROXY; + /** + * @author Eike Stepper + */ + public static class Enhanced extends DynamicProxy implements CDOObjectHandler + { + private final ConcurrentMap<CDOID, EClassifier> types = new ConcurrentHashMap<CDOID, EClassifier>(); - /** - * Returns an object that we want to return to the caller (clients). Exception thrown will be received by the caller - * (clients). - */ - public Object processStaleReference(EObject source, EStructuralFeature feature, int index, CDOID target); + private final CDOView view; + + private final CDOStaleReferencePolicy oldPolicy; + + public Enhanced(CDOView view) + { + this.view = view; + + for (InternalCDOObject object : ((InternalCDOView)view).getObjectsList()) + { + addType(object); + } + + view.addObjectHandler(this); + + Options options = view.options(); + oldPolicy = options.getStaleReferencePolicy(); + options.setStaleReferencePolicy(this); + } + + public void dispose() + { + Options options = view.options(); + options.setStaleReferencePolicy(oldPolicy); + + view.removeObjectHandler(this); + types.clear(); + } + + public void objectStateChanged(CDOView view, CDOObject object, CDOState oldState, CDOState newState) + { + addType(object); + } + + @Override + protected EClassifier getType(EObject source, EStructuralFeature feature, int index, CDOID target) + { + EClassifier type = types.get(target); + if (type != null) + { + return type; + } + + return super.getType(source, feature, index, target); + } + + private void addType(CDOObject object) + { + types.putIfAbsent(object.cdoID(), object.eClass()); + } + } + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/DelegatingSessionProtocol.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/DelegatingSessionProtocol.java index 90c2e1d4bd..6ffb4e0e57 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/DelegatingSessionProtocol.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/DelegatingSessionProtocol.java @@ -661,6 +661,22 @@ public class DelegatingSessionProtocol extends Lifecycle implements CDOSessionPr } } + public CDOBranchPointRange loadObjectLifetime(CDOID id, CDOBranchPoint branchPoint) + { + int attempt = 0; + for (;;) + { + try + { + return delegate.loadObjectLifetime(id, branchPoint); + } + catch (Exception ex) + { + handleException(++attempt, ex); + } + } + } + @Deprecated public LockObjectsResult lockObjects(List<InternalCDORevision> viewedRevisions, int viewID, CDOBranch viewedBranch, LockType lockType, long timeout) throws InterruptedException diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java index 58a8444d68..8251ac740f 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java @@ -1118,6 +1118,7 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent delta.applyTo(newRevision); newRevision.setBranchPoint(target); newRevision.setVersion(target.getVersion()); + newRevision.setRevised(target.getRevised()); cache.addRevision(newRevision); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java index 7a154333f7..0cf6c725b5 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java @@ -267,7 +267,7 @@ public class CDOViewImpl extends AbstractCDOView List<InternalCDOObject> result = new ArrayList<InternalCDOObject>(); for (InternalCDOObject object : getModifiableObjects().values()) { - CDORevision revision = object.cdoRevision(); + CDORevision revision = object.cdoRevision(false); if (revision == null || !revision.isValid(branchPoint)) { result.add(object); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java index ee99c32910..e4af5977eb 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java @@ -47,7 +47,7 @@ import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; import org.eclipse.emf.cdo.spi.common.revision.CDOIDMapper; import org.eclipse.emf.cdo.spi.common.revision.CDOReferenceAdjuster; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager.RevisionLoader; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager.RevisionLoader2; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.net4j.util.CheckUtil; @@ -78,7 +78,8 @@ import java.util.Set; * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. */ -public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLoader3, RevisionLoader, CommitInfoLoader +public interface CDOSessionProtocol extends CDOProtocol, PackageLoader, BranchLoader3, RevisionLoader2, + CommitInfoLoader { public RepositoryTimeResult getRepositoryTime(); diff --git a/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF index 85dc788238..32dcfe26ff 100644 --- a/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j.http.server;singleton:=true -Bundle-Version: 4.0.300.qualifier +Bundle-Version: 4.0.400.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -12,9 +12,9 @@ Bundle-ClassPath: . Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional, org.eclipse.net4j.http.common;bundle-version="[4.0.0,5.0.0)", org.eclipse.equinox.http.registry;bundle-version="[1.0.0,2.0.0)" -Import-Package: javax.servlet;version="[2.3.0,3.0.0)", - javax.servlet.http;version="[2.3.0,3.0.0)" -Export-Package: org.eclipse.net4j.http.internal.server;version="4.0.300";x-friends:="org.eclipse.net4j.http.tests,org.eclipse.net4j.defs", - org.eclipse.net4j.http.internal.server.bundle;version="4.0.300";x-internal:=true, - org.eclipse.net4j.http.internal.server.messages;version="4.0.300";x-internal:=true, - org.eclipse.net4j.http.server;version="4.0.300" +Import-Package: javax.servlet;version="[2.3.0,4.0.0)", + javax.servlet.http;version="[2.3.0,4.0.0)" +Export-Package: org.eclipse.net4j.http.internal.server;version="4.0.400";x-friends:="org.eclipse.net4j.http.tests,org.eclipse.net4j.defs", + org.eclipse.net4j.http.internal.server.bundle;version="4.0.400";x-internal:=true, + org.eclipse.net4j.http.internal.server.messages;version="4.0.400";x-internal:=true, + org.eclipse.net4j.http.server;version="4.0.400" diff --git a/plugins/org.eclipse.net4j.http.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.http.tests/META-INF/MANIFEST.MF index df58a88772..ec3b4ec862 100644 --- a/plugins/org.eclipse.net4j.http.tests/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.http.tests/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j.http.tests;singleton:=true -Bundle-Version: 4.0.300.qualifier +Bundle-Version: 4.0.400.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -13,8 +13,8 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resoluti org.eclipse.net4j.tests;bundle-version="[4.0.0,5.0.0)";visibility:=reexport, org.eclipse.net4j.http;bundle-version="[4.0.0,5.0.0)", org.eclipse.net4j.http.server;bundle-version="[4.0.0,5.0.0)" -Import-Package: javax.servlet;version="[2.3.0,3.0.0)", - javax.servlet.http;version="[2.3.0,3.0.0)", +Import-Package: javax.servlet;version="[2.3.0,4.0.0)", + javax.servlet.http;version="[2.3.0,4.0.0)", org.apache.commons.httpclient;version="[3.0.1,4.0.0)", org.apache.commons.httpclient.methods;version="[3.0.1,4.0.0)" -Export-Package: org.eclipse.net4j.http.tests;version="4.0.300";x-internal:=true +Export-Package: org.eclipse.net4j.http.tests;version="4.0.400";x-internal:=true diff --git a/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF index e68153808c..99ff72ab55 100644 --- a/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.net4j.ui.shared;singleton:=true -Bundle-Version: 4.2.200.qualifier +Bundle-Version: 4.3.0.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -9,8 +9,8 @@ Bundle-ActivationPolicy: lazy Bundle-Activator: org.eclipse.net4j.ui.internal.shared.bundle.OM$Activator Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ClassPath: . -Export-Package: org.eclipse.net4j.ui.shared;version="4.2.200";uses:="org.eclipse.jface.resource,org.eclipse.swt.graphics", - org.eclipse.net4j.ui.internal.shared.bundle;version="4.2.200";x-internal:=true +Export-Package: org.eclipse.net4j.ui.shared;version="4.3.0";uses:="org.eclipse.jface.resource,org.eclipse.swt.graphics", + org.eclipse.net4j.ui.internal.shared.bundle;version="4.3.0";x-internal:=true Require-Bundle: org.eclipse.ui;bundle-version="[3.6.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", org.eclipse.net4j.util;bundle-version="[3.1.0,4.0.0)" diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/information.gif b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/information.gif Binary files differnew file mode 100644 index 0000000000..3679f84ad8 --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/information.gif diff --git a/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java b/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java index 018970677d..de3623f188 100644 --- a/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java +++ b/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java @@ -57,6 +57,11 @@ public class SharedIcons public static final String OBJ_CHAT = OBJ + "chat"; //$NON-NLS-1$ + /** + * @since 4.3 + */ + public static final String OBJ_INFO = OBJ + "information"; //$NON-NLS-1$ + private static final String ETOOL = "etool16/"; //$NON-NLS-1$ public static final String ETOOL_ADD_ACCEPTOR = ETOOL + "add_acceptor"; //$NON-NLS-1$ diff --git a/plugins/org.eclipse.net4j.util.ui/.settings/.api_filters b/plugins/org.eclipse.net4j.util.ui/.settings/.api_filters index ad844b99ad..7018874010 100644 --- a/plugins/org.eclipse.net4j.util.ui/.settings/.api_filters +++ b/plugins/org.eclipse.net4j.util.ui/.settings/.api_filters @@ -94,4 +94,28 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/net4j/util/ui/widgets/ImageButton.java" type="org.eclipse.net4j.util.ui.widgets.ImageButton"> + <filter id="571473929"> + <message_arguments> + <message_argument value="Label"/> + <message_argument value="ImageButton"/> + </message_arguments> + </filter> + </resource> + <resource path="src/org/eclipse/net4j/util/ui/widgets/SecondaryToolItem.java" type="org.eclipse.net4j.util.ui.widgets.SecondaryToolItem"> + <filter id="571473929"> + <message_arguments> + <message_argument value="ToolItem"/> + <message_argument value="SecondaryToolItem"/> + </message_arguments> + </filter> + </resource> + <resource path="src/org/eclipse/net4j/util/ui/widgets/ToolButton.java" type="org.eclipse.net4j.util.ui.widgets.ToolButton"> + <filter id="571473929"> + <message_arguments> + <message_argument value="ToolBar"/> + <message_argument value="ToolButton"/> + </message_arguments> + </filter> + </resource> </component> diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ImageButton.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ImageButton.java new file mode 100644 index 0000000000..18c39cbfdd --- /dev/null +++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ImageButton.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.net4j.util.ui.widgets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseMoveListener; +import org.eclipse.swt.events.MouseTrackListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +/** + * @author Eike Stepper + * @since 3.5 + */ +public class ImageButton extends Label implements MouseTrackListener, MouseMoveListener, MouseListener +{ + private final Image image; + + private final Image grayImage; + + private boolean inImage; + + public ImageButton(Composite parent, Image image) + { + this(parent, image, new Image(parent.getDisplay(), image, SWT.IMAGE_GRAY)); + } + + public ImageButton(Composite parent, Image image, Image grayImage) + { + super(parent, SWT.NONE); + this.image = image; + this.grayImage = grayImage; + + setImage(grayImage); + + addMouseTrackListener(this); + addMouseMoveListener(this); + addMouseListener(this); + } + + public void mouseEnter(MouseEvent e) + { + mouseMove(e); + } + + public void mouseExit(MouseEvent e) + { + mouseMove(e); + } + + public void mouseHover(MouseEvent e) + { + // Do nothing. + } + + public void mouseMove(MouseEvent e) + { + Rectangle bounds = getBounds(); + bounds.x = 0; + bounds.y = 0; + + inImage = bounds.contains(e.x, e.y); + if (inImage) + { + setImage(image); + } + else + { + setImage(grayImage); + } + } + + public void mouseDoubleClick(MouseEvent e) + { + // Do nothing. + } + + public void mouseDown(MouseEvent e) + { + // Do nothing. + } + + public void mouseUp(MouseEvent e) + { + if (inImage) + { + widgetSelected(); + } + } + + @Override + protected void checkSubclass() + { + // Disable the check that prevents subclassing of SWT components. + } + + protected void widgetSelected() + { + } +} diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SecondaryToolItem.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SecondaryToolItem.java new file mode 100644 index 0000000000..fe7564c913 --- /dev/null +++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SecondaryToolItem.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.net4j.util.ui.widgets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +/** + * @author Eike Stepper + * @since 3.5 + */ +public class SecondaryToolItem extends ToolItem +{ + private Image grayImage; + + public SecondaryToolItem(ToolBar parent, int style, Image image) + { + super(parent, style); + init(image); + } + + public SecondaryToolItem(ToolBar parent, int style, int index, Image image) + { + super(parent, style, index); + init(image); + } + + @Override + public void dispose() + { + grayImage.dispose(); + super.dispose(); + } + + @Override + protected void checkSubclass() + { + // Do nothing. + } + + public void init(Image image) + { + if (grayImage != null) + { + grayImage.dispose(); + } + + grayImage = new Image(getDisplay(), image, SWT.IMAGE_GRAY); + setImage(grayImage); + setHotImage(image); + } +} diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ToolButton.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ToolButton.java new file mode 100644 index 0000000000..eb3151dc37 --- /dev/null +++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ToolButton.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.net4j.util.ui.widgets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +/** + * @author Eike Stepper + * @since 3.5 + */ +public class ToolButton extends ToolBar +{ + private final ToolItem toolItem; + + public ToolButton(Composite parent, int style, Image image, boolean secondary) + { + super(parent, SWT.FLAT); + + if (secondary) + { + toolItem = new SecondaryToolItem(this, style, image); + } + else + { + toolItem = new ToolItem(this, style); + toolItem.setImage(image); + } + } + + public final ToolItem getToolItem() + { + return toolItem; + } + + public void setImage(Image image) + { + if (toolItem instanceof SecondaryToolItem) + { + SecondaryToolItem secondaryToolItem = (SecondaryToolItem)toolItem; + secondaryToolItem.init(image); + } + else + { + toolItem.setImage(image); + } + } + + public void addSelectionListener(SelectionListener listener) + { + toolItem.addSelectionListener(listener); + } + + public boolean getSelection() + { + return toolItem.getSelection(); + } + + @Override + public String getToolTipText() + { + return toolItem.getToolTipText(); + } + + public void removeSelectionListener(SelectionListener listener) + { + toolItem.removeSelectionListener(listener); + } + + public void setSelection(boolean selected) + { + toolItem.setSelection(selected); + } + + @Override + public void setToolTipText(String string) + { + toolItem.setToolTipText(string); + } + + @Override + protected void checkSubclass() + { + // Do nothing. + } +} diff --git a/plugins/org.gastro.server.web/META-INF/MANIFEST.MF b/plugins/org.gastro.server.web/META-INF/MANIFEST.MF index e38b462cdd..9a3881f048 100644 --- a/plugins/org.gastro.server.web/META-INF/MANIFEST.MF +++ b/plugins/org.gastro.server.web/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: CDO Electronic Restaurant Example Server Web Support Bundle-SymbolicName: org.gastro.server.web;singleton:=true -Bundle-Version: 4.1.200.qualifier +Bundle-Version: 4.1.300.qualifier Bundle-Activator: org.gastro.server.internal.web.OM$Activator Bundle-Vendor: Eclipse Modeling Project Require-Bundle: org.apache.commons.logging;bundle-version="[1.1.0,2.0.0)", @@ -16,10 +16,10 @@ Require-Bundle: org.apache.commons.logging;bundle-version="[1.1.0,2.0.0)", org.gastro.business;bundle-version="[4.0.0,5.0.0)", org.gastro.inventory;bundle-version="[4.0.0,5.0.0)" Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Import-Package: javax.servlet;version="[2.3.0,3.0.0)", - javax.servlet.http;version="[2.3.0,3.0.0)", +Import-Package: javax.servlet;version="[2.3.0,4.0.0)", + javax.servlet.http;version="[2.3.0,4.0.0)", org.apache.commons.lang;version="[2.3.0,3.0.0)" Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Export-Package: org.gastro.server.internal.web;version="4.1.200";x-internal:=true, +Export-Package: org.gastro.server.internal.web;version="4.1.300";x-internal:=true, templates;version="4.1.100";x-internal:=true |