/*******************************************************************************
* Copyright (c) 2006-2010, G. Weirich and Elexis
* 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:
* G. Weirich - initial implementation, adapted from JavaAgenda
*
*******************************************************************************/
package ch.elexis.actions;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import ch.elexis.agenda.Messages;
import ch.elexis.agenda.acl.ACLContributor;
import ch.elexis.agenda.data.Termin;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.ui.actions.RestrictedAction;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.locks.AcquireLockBlockingUi;
import ch.elexis.core.ui.locks.ILockHandler;
import ch.elexis.core.ui.locks.LockRequestingRestrictedAction;
/**
* Some common actions for the agenda
*
* @author gerry
*
*/
public class AgendaActions {
/** delete an appointment */
private static LockRequestingRestrictedAction<Termin> delTerminAction;
/** Display or change the state of an appointment */
private static IAction terminStatusAction;
/**
* Reflect the user's rights on the agenda actions
*/
public static void updateActions(){
getTerminStatusAction().setEnabled(CoreHub.acl.request(ACLContributor.USE_AGENDA));
((RestrictedAction) getDelTerminAction()).reflectRight();
}
public static IAction getDelTerminAction(){
if (delTerminAction == null) {
makeActions();
}
return delTerminAction;
}
public static IAction getTerminStatusAction(){
if (terminStatusAction == null) {
makeActions();
}
return terminStatusAction;
}
private static void makeActions(){
delTerminAction = new LockRequestingRestrictedAction<Termin>(ACLContributor.DELETE_APPOINTMENTS,
Messages.AgendaActions_deleteDate) {
{
setImageDescriptor(Images.IMG_DELETE.getImageDescriptor());
setToolTipText(Messages.AgendaActions_deleteDate);
}
@Override
public Termin getTargetedObject() {
return (Termin) ElexisEventDispatcher.getSelected(Termin.class);
}
@Override
public void doRun(Termin element) {
element.delete();
ElexisEventDispatcher.reload(Termin.class);
}
};
terminStatusAction = new Action(Messages.AgendaActions_state, Action.AS_DROP_DOWN_MENU) {
Menu mine = null;
Listener showListener = null;
{
setMenuCreator(new IMenuCreator() {
public void dispose(){
if (mine != null) {
removeShowListener();
mine.dispose();
}
}
public Menu getMenu(Control parent){
mine = new Menu(parent);
fillMenu();
addShowListener();
return mine;
}
public Menu getMenu(Menu parent){
mine = new Menu(parent);
fillMenu();
addShowListener();
return mine;
}
private void removeShowListener(){
if (mine != null && showListener != null) {
mine.removeListener(SWT.Show, showListener);
}
}
private void addShowListener(){
if (mine != null) {
removeShowListener();
showListener = new Listener() {
@Override
public void handleEvent(Event event){
Menu menu = (Menu) event.widget;
Termin actTermin =
(Termin) ElexisEventDispatcher.getSelected(Termin.class);
if (actTermin != null) {
String actTerminStatus = actTermin.getStatus();
if (actTerminStatus != null) {
for (MenuItem menuItem : menu.getItems()) {
menuItem.setSelection(StringUtils
.equals(actTerminStatus, menuItem.getText()));
}
}
}
}
};
mine.addListener(SWT.Show, showListener);
}
}
});
}
void fillMenu(){
for (String t : Termin.TerminStatus) {
MenuItem it = new MenuItem(mine, SWT.CHECK);
it.setText(t);
it.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
Termin act = (Termin) ElexisEventDispatcher.getSelected(Termin.class);
AcquireLockBlockingUi.aquireAndRun(act, new ILockHandler() {
@Override
public void lockFailed(){
// do nothing
}
@Override
public void lockAcquired(){
MenuItem it = (MenuItem) e.getSource();
act.setStatus(it.getText());
ElexisEventDispatcher.reload(Termin.class);
}
});
}
});
}
}
};
}
}