Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--features/org.eclipse.net4j.tests-feature/feature.xml2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/.settings/.api_filters6
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java9
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java22
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java12
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java20
-rw-r--r--plugins/org.eclipse.emf.cdo.dawn.tests/META-INF/MANIFEST.MF2
-rw-r--r--plugins/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.examples.installer/examples/org.eclipse.emf.cdo.examples.company.edit/src/org/eclipse/emf/cdo/examples/company/provider/CompanyItemProvider.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.examples.installer/examples/org.gastro.server.web/META-INF/MANIFEST.MF8
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/icons/close.gifbin0 -> 73 bytes
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/icons/close_hover.gifbin0 -> 73 bytes
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/bundle/OM.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/AbstractActionProvider.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/CDOCheckoutDashboard.java397
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/OpenWithActionProvider.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/ShowInActionProvider.java170
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/repositories/CDORepositoriesView.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/internal/explorer/checkouts/CDOCheckoutImpl.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadObjectLifetimeRequest.java80
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadObjectLifetimeIndication.java74
-rw-r--r--plugins/org.eclipse.emf.cdo.server/.settings/.api_filters6
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java95
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java39
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/.settings/.api_filters8
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/CDOClient1.launch65
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java188
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/widgets/TimeSlider.java247
-rw-r--r--plugins/org.eclipse.emf.cdo/.settings/.api_filters14
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java11
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOStaleReferencePolicy.java213
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/DelegatingSessionProtocol.java16
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java1
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOSessionProtocol.java5
-rw-r--r--plugins/org.eclipse.net4j.http.server/META-INF/MANIFEST.MF14
-rw-r--r--plugins/org.eclipse.net4j.http.tests/META-INF/MANIFEST.MF8
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF6
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/information.gifbin0 -> 267 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java5
-rw-r--r--plugins/org.eclipse.net4j.util.ui/.settings/.api_filters24
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ImageButton.java112
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SecondaryToolItem.java62
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/ToolButton.java98
-rw-r--r--plugins/org.gastro.server.web/META-INF/MANIFEST.MF8
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
new file mode 100644
index 0000000000..b914f86241
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close.gif
Binary files differ
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
new file mode 100644
index 0000000000..5ba249166b
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/icons/close_hover.gif
Binary files differ
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&#13;&#10;-console&#13;&#10;-clean"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -nosplash&#13;&#10;-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&#13;&#10;-Xms40m&#13;&#10;-Xmx1g&#13;&#10;-Dosgi.console.enable.builtin=true&#13;&#10;-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
new file mode 100644
index 0000000000..3679f84ad8
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/information.gif
Binary files differ
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

Back to the top