/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sling.ide.eclipse.ui.dnd.assistant;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.SubContributionManager;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Simple (static..) utility class which is handling showing an error message
* in the workbench window's main status bar
* <p>
* TODO: consider rewriting this as a service - but considering this optional beautification atm
*/
public class StatusLineUtils {
private static long statusModCnt = 0;
private static boolean isShowing = false;
private static final Object syncObj = new Object();
private static IStatusLineManager getStatusLineManager() {
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow==null) {
return null;
}
IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
if (activePage==null) {
return null;
}
IEditorPart activeEditor = activePage.getActiveEditor();
if (activeEditor!=null) {
return activeEditor.getEditorSite().getActionBars().getStatusLineManager();
}
IViewReference[] viewRefs = activePage.getViewReferences();
if (viewRefs!=null) {
for (IViewReference aViewRef : viewRefs) {
IViewPart view = aViewRef.getView(false);
if (view!=null) {
return view.getViewSite().getActionBars().getStatusLineManager();
}
}
}
IEditorReference[] editorRefs = activePage.getEditorReferences();
if (editorRefs!=null) {
for (IEditorReference anEditorRef : editorRefs) {
IEditorPart editor = anEditorRef.getEditor(false);
if (editor!=null) {
return editor.getEditorSite().getActionBars().getStatusLineManager();
}
}
}
IWorkbenchPart activePart = activePage.getActivePart();
if (activePart==null) {
return null;
}
IWorkbenchPartSite site = activePart.getSite();
if (site instanceof IEditorSite) {
IEditorSite editorSite = (IEditorSite)site;
return editorSite.getActionBars().getStatusLineManager();
} else if (site instanceof IViewSite) {
IViewSite viewSite = (IViewSite)site;
return viewSite.getActionBars().getStatusLineManager();
} else {
return null;
}
}
public static void resetErrorMessage() {
synchronized(syncObj) {
if (!isShowing) {
return;
}
isShowing = false;
}
doSetErrorMessage(null);
}
public static void setErrorMessage(int durationInMillis, final String message) {
final long myModCnt;
synchronized(syncObj) {
myModCnt = ++statusModCnt;
isShowing = true;
}
doSetErrorMessage(message);
Display.getDefault().timerExec(durationInMillis, new Runnable() {
@Override
public void run() {
if (statusModCnt>myModCnt) {
return;
}
synchronized(syncObj) {
if (!isShowing) {
return;
}
isShowing = false;
}
doSetErrorMessage(null);
}
});
}
private static void doSetErrorMessage(final String message) {
final IStatusLineManager statusLineManager = getStatusLineManager();
if (statusLineManager!=null) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
if (statusLineManager instanceof SubContributionManager) {
SubContributionManager sub = (SubContributionManager)statusLineManager;
StatusLineManager parent = (StatusLineManager) sub.getParent();
parent.setErrorMessage(message);
parent.update(true);
} else {
statusLineManager.setErrorMessage(message);
statusLineManager.update(true);
}
}
});
}
}
}