/******************************************************************************* * Copyright (c) 2006-2011, 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 *******************************************************************************/ package ch.elexis.core.ui.views; import java.text.MessageFormat; import java.time.LocalDate; import java.util.Hashtable; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IMemento; import org.eclipse.ui.ISaveablePart2; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.part.ViewPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.admin.AccessControlDefaults; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListener; import ch.elexis.core.data.util.Extensions; import ch.elexis.core.model.IPersistentObject; import ch.elexis.core.model.ISticker; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.actions.GlobalActions; import ch.elexis.core.ui.actions.GlobalEventDispatcher; import ch.elexis.core.ui.actions.IActivationListener; import ch.elexis.core.ui.actions.RestrictedAction; import ch.elexis.core.ui.constants.ExtensionPointConstantsUi; import ch.elexis.core.ui.data.UiMandant; import ch.elexis.core.ui.data.UiSticker; import ch.elexis.core.ui.dialogs.AssignStickerDialog; import ch.elexis.core.ui.dialogs.KontaktSelektor; import ch.elexis.core.ui.events.ElexisUiEventListenerImpl; import ch.elexis.core.ui.events.ElexisUiSyncEventListenerImpl; import ch.elexis.core.ui.icons.ImageSize; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.locks.IUnlockable; import ch.elexis.core.ui.locks.LockedAction; import ch.elexis.core.ui.locks.LockedRestrictedAction; import ch.elexis.core.ui.locks.ToggleCurrentKonsultationLockHandler; import ch.elexis.core.ui.text.EnhancedTextField; import ch.elexis.core.ui.util.IKonsExtension; import ch.elexis.core.ui.util.IKonsMakro; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.ViewMenus; import ch.elexis.data.Anwender; import ch.elexis.data.Artikel; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Mandant; import ch.elexis.data.Patient; import ch.elexis.data.Rechnungssteller; import ch.elexis.data.Sticker; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeTool; import ch.rgw.tools.VersionedResource; import ch.rgw.tools.VersionedResource.ResourceItem; /** * Behandlungseintrag, Diagnosen und Verrechnung Dg und Verrechnung können wie Drag&Drop aus den * entsprechenden Listen.Views auf die Felder gezogen werden. * * @author gerry * */ public class KonsDetailView extends ViewPart implements IActivationListener, ISaveablePart2, IUnlockable { private static final String NO_CONS_SELECTED = Messages.KonsDetailView_NoConsSelected; // $NON-NLS-1$ public static final String ID = "ch.elexis.Konsdetail"; //$NON-NLS-1$ public static final String CFG_VERTRELATION = "vertrelation"; //$NON-NLS-1$ public static final String CFG_HORIZRELATION = "horizrelation"; //$NON-NLS-1$ private Logger log = LoggerFactory.getLogger(KonsDetailView.class); Hashtable<String, IKonsExtension> hXrefs; EnhancedTextField text; private Label lBeh; Hyperlink hlMandant; Combo cbFall; private Konsultation actKons; FormToolkit tk; Form form; Patient actPat; Color defaultBackground; private DiagnosenDisplay dd; private VerrechnungsDisplay vd; private Action versionBackAction; private LockedAction<Konsultation> saveAction; private RestrictedAction purgeAction; Action versionFwdAction, assignStickerAction, versionDisplayAction; int displayedVersion; Font emFont; Composite cDesc; Composite cEtiketten; private int[] sashWeights = null; private SashForm sash; private int[] diagAndChargeSashWeights = null; private SashForm diagAndChargeSash; private final ElexisEventListener eeli_pat = new ElexisUiEventListenerImpl(Patient.class, ElexisEvent.EVENT_UPDATE | ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_RELOAD) { @Override public void runInUi(ElexisEvent ev){ actPat = null; // make sure patient will be updated setPatient((Patient) ev.getObject()); }; }; private final ElexisEventListener eeli_user = new ElexisUiEventListenerImpl(Anwender.class, ElexisEvent.EVENT_USER_CHANGED) { @Override public void runInUi(ElexisEvent ev){ adaptMenus(); } }; private final ElexisEventListener eeli_fall = new ElexisUiEventListenerImpl(Fall.class, ElexisEvent.EVENT_RELOAD | ElexisEvent.EVENT_DELETE) { @Override public void runInUi(ElexisEvent ev){ updateFallCombo(); }; }; private final ElexisEventListener eeli_kons_sync = new ElexisUiSyncEventListenerImpl(Konsultation.class, ElexisEvent.EVENT_LOCK_PRERELEASE) { @Override public void runInUi(ElexisEvent ev){ Konsultation kons = (Konsultation) ev.getObject(); if (kons.equals(actKons)) { save(); } } }; private final ElexisEventListener eeli_kons = new ElexisUiEventListenerImpl(Konsultation.class, ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED | ElexisEvent.EVENT_LOCK_AQUIRED | ElexisEvent.EVENT_LOCK_RELEASED | ElexisEvent.EVENT_UPDATE) { @Override public void runInUi(ElexisEvent ev){ Konsultation kons = (Konsultation) ev.getObject(); Konsultation deselectedKons = null; switch (ev.getType()) { case ElexisEvent.EVENT_SELECTED: deselectedKons = actKons; setKons(kons); releaseAndRefreshLock(deselectedKons, ToggleCurrentKonsultationLockHandler.COMMAND_ID); break; case ElexisEvent.EVENT_UPDATE: setKons(kons); break; case ElexisEvent.EVENT_DESELECTED: deselectedKons = actKons; setKons(null); releaseAndRefreshLock(deselectedKons, ToggleCurrentKonsultationLockHandler.COMMAND_ID); break; case ElexisEvent.EVENT_LOCK_AQUIRED: case ElexisEvent.EVENT_LOCK_RELEASED: if (kons.equals(actKons)) { setUnlocked(ev.getType() == ElexisEvent.EVENT_LOCK_AQUIRED); } break; default: break; } } }; private void releaseAndRefreshLock(IPersistentObject object, String commandId){ if (object != null && CoreHub.getLocalLockService().isLockedLocal(object)) { CoreHub.getLocalLockService().releaseLock(object); } ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); commandService.refreshElements(commandId, null); } @Override public void saveState(IMemento memento){ int[] w = sash.getWeights(); memento.putString(CFG_VERTRELATION, Integer.toString(w[0]) + StringConstants.COMMA + Integer.toString(w[1])); w = diagAndChargeSash.getWeights(); memento.putString(CFG_HORIZRELATION, Integer.toString(w[0]) + StringConstants.COMMA + Integer.toString(w[1])); super.saveState(memento); } @Override public void setUnlocked(boolean unlocked){ boolean hlMandantEnabled = actKons != null && actKons.isEditable(false) && CoreHub.acl.request(AccessControlDefaults.KONS_REASSIGN) && unlocked; hlMandant.setEnabled(hlMandantEnabled); boolean cbFallEnabled = actKons != null && actKons.isEditable(false) && unlocked; cbFall.setEnabled(cbFallEnabled); text.setEditable(unlocked); // update the UI IToolBarManager mgr = ((IViewSite) getSite()).getActionBars().getToolBarManager(); IContributionItem[] items = mgr.getItems(); for (IContributionItem iContributionItem : items) { iContributionItem.update(); } } @Override public void createPartControl(final Composite p){ setTitleImage(Images.IMG_VIEW_CONSULTATION_DETAIL.getImage()); sash = new SashForm(p, SWT.VERTICAL); tk = UiDesk.getToolkit(); form = tk.createForm(sash); form.getBody().setLayout(new GridLayout(1, true)); form.setText(NO_CONS_SELECTED); cEtiketten = new Composite(form.getBody(), SWT.NONE); cEtiketten.setLayout(new RowLayout(SWT.HORIZONTAL)); cEtiketten.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); cDesc = new Composite(form.getBody(), SWT.NONE); cDesc.setLayout(new RowLayout(SWT.HORIZONTAL)); cDesc.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); lBeh = tk.createLabel(cDesc, NO_CONS_SELECTED); emFont = UiDesk.getFont("Helvetica", 11, SWT.BOLD); //$NON-NLS-1$ lBeh.setFont(emFont); defaultBackground = p.getBackground(); // lBeh.setBackground(); hlMandant = tk.createHyperlink(cDesc, "--", SWT.NONE); //$NON-NLS-1$ hlMandant.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e){ KontaktSelektor ksl = new KontaktSelektor(getSite().getShell(), Mandant.class, Messages.KonsDetailView_SelectMandatorCaption, // $NON-NLS-1$ Messages.KonsDetailView_SelectMandatorBody, new String[] { Mandant.FLD_SHORT_LABEL, Mandant.FLD_NAME1, Mandant.FLD_NAME2 }); // $NON-NLS-1$ if (ksl.open() == Dialog.OK) { actKons.setMandant((Mandant) ksl.getSelection()); setKons(actKons); } } }); hlMandant.setBackground(p.getBackground()); cbFall = new Combo(form.getBody(), SWT.SINGLE); cbFall.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e){ Fall[] faelle = (Fall[]) cbFall.getData(); int i = cbFall.getSelectionIndex(); if (i > -1 && i < faelle.length) { Fall nFall = faelle[i]; Fall actFall = null; String fallId = ""; String fallLabel = "Current Case NOT found!!";//$NON-NLS-1$ if (actKons != null) { actFall = actKons.getFall(); fallId = actFall.getId(); fallLabel = actFall.getLabel(); } if (!nFall.getId().equals(fallId)) { if (!nFall.isOpen()) { SWTHelper.alert(Messages.KonsDetailView_CaseClosedCaption, // $NON-NLS-1$ Messages.KonsDetailView_CaseClosedBody); // $NON-NLS-1$ } else { MessageDialog msd = new MessageDialog(getViewSite().getShell(), Messages.KonsDetailView_ChangeCaseCaption, // $NON-NLS-1$ Images.IMG_LOGO.getImage(ImageSize._75x66_TitleDialogIconSize), MessageFormat.format( Messages.KonsDetailView_ConfirmChangeConsToCase, new Object[] { fallLabel, nFall.getLabel() }), MessageDialog.QUESTION, new String[] { Messages.KonsDetailView_Yes, // $NON-NLS-1$ Messages.KonsDetailView_No }, 0); // $NON-NLS-1$ if (msd.open() == 0) { actKons.setFall(nFall); setKons(actKons); } } } } } }); GridData gdFall = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); cbFall.setLayoutData(gdFall); text = new EnhancedTextField(form.getBody()); hXrefs = new Hashtable<String, IKonsExtension>(); @SuppressWarnings("unchecked") List<IKonsExtension> xrefs = Extensions.getClasses(Extensions.getExtensions(ExtensionPointConstantsUi.KONSEXTENSION), "KonsExtension", false); //$NON-NLS-1$ //$NON-NLS-2$ for (IKonsExtension x : xrefs) { String provider = x.connect(text); hXrefs.put(provider, x); } text.setXrefHandlers(hXrefs); @SuppressWarnings("unchecked") List<IKonsMakro> makros = Extensions.getClasses( Extensions.getExtensions(ExtensionPointConstantsUi.KONSEXTENSION), "KonsMakro", false); //$NON-NLS-1$ //$NON-NLS-2$ text.setExternalMakros(makros); GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL | GridData.GRAB_HORIZONTAL); text.setLayoutData(gd); tk.adapt(text); diagAndChargeSash = new SashForm(sash, SWT.HORIZONTAL); Composite botleft = tk.createComposite(diagAndChargeSash); botleft.setLayout(new GridLayout(1, false)); Composite botright = tk.createComposite(diagAndChargeSash); botright.setLayout(new GridLayout(1, false)); dd = new DiagnosenDisplay(getSite().getPage(), botleft, SWT.NONE); dd.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); vd = new VerrechnungsDisplay(getSite().getPage(), botright, SWT.NONE); vd.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); getSite().registerContextMenu(ID + ".VerrechnungsDisplay", vd.contextMenuManager, vd.viewer); getSite().setSelectionProvider(vd.viewer); diagAndChargeSash.setWeights(diagAndChargeSashWeights == null ? new int[] { 40, 60 } : diagAndChargeSashWeights); makeActions(); ViewMenus menu = new ViewMenus(getViewSite()); menu.createMenu(versionDisplayAction, versionFwdAction, versionBackAction, GlobalActions.neueKonsAction, GlobalActions.delKonsAction, GlobalActions.redateAction, assignStickerAction, purgeAction); sash.setWeights(sashWeights == null ? new int[] { 80, 20 } : sashWeights); menu.createToolbar(GlobalActions.neueKonsAction, saveAction); GlobalEventDispatcher.addActivationListener(this, this); ElexisEventDispatcher.getInstance().addListeners(eeli_kons, eeli_kons_sync, eeli_pat, eeli_user, eeli_fall); text.connectGlobalActions(getViewSite()); adaptMenus(); setKons((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); } @Override public void init(IViewSite site, IMemento memento) throws PartInitException{ if (memento == null) { sashWeights = new int[] { 80, 20 }; diagAndChargeSashWeights = new int[] { 40, 60 }; } else { String state = memento.getString(CFG_VERTRELATION); if (state == null) { state = "80,20"; //$NON-NLS-1$ } String[] sw = state.split(StringConstants.COMMA); sashWeights = new int[] { Integer.parseInt(sw[0]), Integer.parseInt(sw[1]) }; state = memento.getString(CFG_HORIZRELATION); if (state == null) { state = "40,60"; //$NON-NLS-1$ } sw = state.split(StringConstants.COMMA); diagAndChargeSashWeights = new int[] { Integer.parseInt(sw[0]), Integer.parseInt(sw[1]) }; } super.init(site, memento); } /* * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose(){ GlobalEventDispatcher.removeActivationListener(this, this); ElexisEventDispatcher.getInstance().removeListeners(eeli_kons, eeli_kons_sync, eeli_pat, eeli_user, eeli_fall); text.disconnectGlobalActions(getViewSite()); // emFont.dispose(); super.dispose(); } /** Aktuellen patient setzen */ private synchronized void setPatient(Patient pat){ if (pat != null && actPat != null) { if (pat.getId().equals(actPat.getId())) { if (!form.getText().equals(Messages.KonsDetailView_NoConsSelected)) { return; } } } for (Control cc : cEtiketten.getChildren()) { cc.dispose(); } if (pat == null) { pat = ElexisEventDispatcher.getSelectedPatient(); } actPat = pat; if (pat != null) { form.setText(pat.getPersonalia() + StringTool.space + "(" + pat.getAlter() + ")"); List<ISticker> etis = pat.getStickers(); if (etis != null && etis.size() > 0) { // Point size = form.getHead().getSize(); for (ISticker et : etis) { if (et != null) { new UiSticker((Sticker) et).createForm(cEtiketten); } } } updateFallCombo(); } form.layout(); } private void updateFallCombo(){ Patient pat = ElexisEventDispatcher.getSelectedPatient(); if (pat != null) { Fall[] faelle = pat.getFaelle(); cbFall.removeAll(); cbFall.setData(faelle); for (Fall f : faelle) { cbFall.add(f.getLabel()); } } } @Override public void setFocus(){ text.setFocus(); } /** * Aktuelle Konsultation setzen. */ private synchronized void setKons(final Konsultation kons){ if (actKons != null && text.isDirty()) { actKons.updateEintrag(text.getContentsAsXML(), false); } if (kons != null) { Fall act = kons.getFall(); setPatient(act.getPatient()); setKonsText(kons, kons.getHeadVersion()); Fall[] faelle = (Fall[]) cbFall.getData(); for (int i = 0; i < faelle.length; i++) { if (faelle[i].getId().equals(act.getId())) { cbFall.select(i); break; } } cbFall.setEnabled(act.isOpen()); Mandant m = kons.getMandant(); lBeh.setText(kons.getDatum() + " (" //$NON-NLS-1$ + new TimeTool(kons.getDatum()).getDurationToNowString() + ")"); //$NON-NLS-1$ StringBuilder sb = new StringBuilder(); if (m == null) { sb.append(Messages.KonsDetailView_NotYours); // $NON-NLS-1$ hlMandant.setBackground(hlMandant.getParent().getBackground()); } else { Rechnungssteller rs = m.getRechnungssteller(); if (rs.getId().equals(m.getId())) { sb.append("(").append(m.getLabel()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ } else { sb.append("(").append(m.getLabel()).append("/").append( //$NON-NLS-1$ //$NON-NLS-2$ rs.getLabel()).append(")"); //$NON-NLS-1$ } hlMandant.setBackground(UiMandant.getColorForMandator(m)); } hlMandant.setText(sb.toString()); boolean hlMandantEnabled = kons.isEditable(false) && CoreHub.acl.request(AccessControlDefaults.KONS_REASSIGN); hlMandant.setEnabled(hlMandantEnabled); dd.setDiagnosen(kons); vd.setLeistungen(kons); vd.setEnabled(true); dd.setEnabled(true); if (kons.isEditable(false)) { text.setEnabled(true); text.setToolTipText(""); lBeh.setForeground(UiDesk.getColor(UiDesk.COL_BLACK)); lBeh.setBackground(defaultBackground); } else { text.setToolTipText("Konsultation geschlossen oder nicht von Ihnen"); lBeh.setForeground(UiDesk.getColor(UiDesk.COL_GREY60)); lBeh.setBackground(UiDesk.getColor(UiDesk.COL_GREY20)); } if (isKonsToday(kons)) { text.setTextBackground(UiDesk.getColor(UiDesk.COL_WHITE)); } else { text.setTextBackground(UiDesk.getColorFromRGB("FAFAFA")); } } else { form.setText(NO_CONS_SELECTED); lBeh.setText("-"); //$NON-NLS-1$ hlMandant.setText("--"); //$NON-NLS-1$ hlMandant.setEnabled(false); hlMandant.setBackground(hlMandant.getParent().getBackground()); dd.clear(); vd.clear(); text.setText(""); //$NON-NLS-1$ text.setEnabled(false); vd.setEnabled(false); dd.setEnabled(false); } actKons = kons; cDesc.layout(); if (actKons == null) { setUnlocked(false); } else { setUnlocked(CoreHub.getLocalLockService().isLockedLocal(actKons)); } } private boolean isKonsToday(Konsultation kons){ TimeTool konsDate = new TimeTool(kons.getDatum()); return konsDate.toLocalDate().isEqual(LocalDate.now()); } void setKonsText(final Konsultation b, final int version){ String ntext = ""; //$NON-NLS-1$ if ((version >= 0) && (version <= b.getHeadVersion())) { VersionedResource vr = b.getEintrag(); ResourceItem entry = vr.getVersion(version); ntext = entry.data; StringBuilder sb = new StringBuilder(); sb.append("rev. ").append(version).append(Messages.KonsDetailView_of) //$NON-NLS-1$ .append( //$NON-NLS-2$ new TimeTool(entry.timestamp).toString(TimeTool.FULL_GER)) .append(" (").append(entry.remark).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ versionDisplayAction.setText(sb.toString()); } else { versionDisplayAction.setText(""); } text.setText(ntext); text.setKons(b); displayedVersion = version; versionBackAction.setEnabled(version != 0); versionFwdAction.setEnabled(version != b.getHeadVersion()); } private void makeActions(){ versionDisplayAction = new Action() { private String versionText; @Override public String getText(){ return versionText; } @Override public void setText(String text){ versionText = text; } @Override public boolean isEnabled(){ return false; } }; purgeAction = new LockedRestrictedAction<Konsultation>(AccessControlDefaults.AC_PURGE, Messages.KonsDetailView_PurgeOldEntries) { @Override public Konsultation getTargetedObject(){ return actKons; } @Override public void doRun(Konsultation element){ element.purgeEintrag(); ElexisEventDispatcher.fireSelectionEvent(element); } }; versionBackAction = new Action(Messages.KonsDetailView_PreviousEntry) { // $NON-NLS-1$ @Override public void run(){ if (actKons == null) { return; } if (MessageDialog.openConfirm(getViewSite().getShell(), Messages.KonsDetailView_ReplaceKonsTextCaption, // $NON-NLS-1$ Messages.KonsDetailView_ReplaceKonsTextBody)) { // $NON-NLS-1$ setKonsText(actKons, displayedVersion - 1); text.setDirty(true); } } }; versionFwdAction = new Action(Messages.KonsDetailView_nextEntry) { // $NON-NLS-1$ @Override public void run(){ if (actKons == null) { return; } if (MessageDialog.openConfirm(getViewSite().getShell(), Messages.KonsDetailView_ReplaceKonsTextCaption, // $NON-NLS-1$ Messages.KonsDetailView_ReplaceKonsTextBody2)) { // $NON-NLS-1$ setKonsText(actKons, displayedVersion + 1); text.setDirty(true); } } }; saveAction = new LockedAction<Konsultation>(Messages.KonsDetailView_SaveEntry) { { setImageDescriptor(Images.IMG_DISK.getImageDescriptor()); setToolTipText(Messages.KonsDetailView_SaveExplicit); // $NON-NLS-1$ } @Override public Konsultation getTargetedObject(){ return actKons; } @Override public void doRun(Konsultation element){ save(); } }; versionFwdAction.setImageDescriptor(Images.IMG_NEXT.getImageDescriptor()); versionBackAction.setImageDescriptor(Images.IMG_PREVIOUS.getImageDescriptor()); purgeAction.setImageDescriptor(Images.IMG_DELETE.getImageDescriptor()); assignStickerAction = new Action("Sticker...") { { setToolTipText("Der Konsultation einer Sticker zuweisen"); } @Override public void run(){ if (actKons != null) { AssignStickerDialog asd = new AssignStickerDialog(getViewSite().getShell(), actKons); asd.open(); } } }; } public void save(){ if (actKons != null) { if (text.isDirty()) { actKons.updateEintrag(text.getContentsAsXML(), false); text.setDirty(false); } setKons(actKons); } else { log.warn("Save() actKons == null"); } } public void adaptMenus(){ vd.tVerr.getMenu().setEnabled(CoreHub.acl.request(AccessControlDefaults.LSTG_VERRECHNEN)); } /* * Die folgenden 6 Methoden implementieren das Interface ISaveablePart2 Wir * benötigen das Interface nur, um das Schliessen einer View zu verhindern, * wenn die Perspektive fixiert ist. Gibt es da keine einfachere Methode? */ @Override public int promptToSaveOnClose(){ return GlobalActions.fixLayoutAction.isChecked() ? ISaveablePart2.CANCEL : ISaveablePart2.NO; } @Override public void doSave(final IProgressMonitor monitor){ /* leer */ } @Override public void doSaveAs(){ /* leer */ } @Override public boolean isDirty(){ return true; } @Override public boolean isSaveAsAllowed(){ return false; } @Override public boolean isSaveOnCloseNeeded(){ return true; } public void addToVerechnung(Artikel artikel){ vd.addPersistentObject(artikel); } @Override public void activation(boolean mode){ if ((mode == false) && (text.isDirty())) { // save entry on deactivation if text was edited if (actKons != null) { actKons.updateEintrag(text.getContentsAsXML(), false); text.setDirty(false); } } else { // load newest version on activation if (actKons != null) { setKonsText(actKons, actKons.getHeadVersion()); } } } @Override public void visible(boolean mode){ if (mode == true) { adaptMenus(); } } }