All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jdplus.toolkit.desktop.plugin.ui.calendar.actions.EditCalendarAction Maven / Gradle / Ivy

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jdplus.toolkit.desktop.plugin.ui.calendar.actions;

import jdplus.toolkit.desktop.plugin.nodes.SingleNodeAction;
import jdplus.toolkit.desktop.plugin.ui.calendar.ChainedGregorianCalendarPanel;
import jdplus.toolkit.desktop.plugin.ui.calendar.CompositeGregorianCalendarPanel;
import jdplus.toolkit.desktop.plugin.ui.calendar.NationalCalendarPanel;
import jdplus.toolkit.desktop.plugin.workspace.CalendarDocumentManager;
import jdplus.toolkit.desktop.plugin.workspace.Workspace;
import jdplus.toolkit.desktop.plugin.workspace.WorkspaceFactory;
import jdplus.toolkit.desktop.plugin.workspace.WorkspaceItem;
import jdplus.toolkit.desktop.plugin.workspace.nodes.ItemWsNode;
import jdplus.toolkit.base.api.timeseries.calendars.*;
import jdplus.toolkit.base.api.timeseries.regression.ModellingContext;
import jdplus.toolkit.base.api.util.WeightedItem;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionRegistration;
import org.openide.util.NbBundle.Messages;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

@ActionID(category = "Tools", id = "demetra.desktop.ui.calendars.actions.EditCalendarAction")
@ActionRegistration(displayName = "#CTL_EditCalendarAction", lazy = false)
@ActionReferences({
    @ActionReference(path = CalendarDocumentManager.ITEMPATH, position = 1420, separatorBefore = 1400)
})
@Messages("CTL_EditCalendarAction=Edit")
public final class EditCalendarAction extends SingleNodeAction {

    public EditCalendarAction() {
        super(ItemWsNode.class);
    }

    @Override
    protected void performAction(ItemWsNode activatedNode) {
        CalendarManager manager = ModellingContext.getActiveContext().getCalendars();
        CalendarDefinition o = AddCalendarAction.getProvider(activatedNode);
        if (o instanceof Calendar cal) {
            editNationalCalendar(manager, cal, activatedNode);
        } else if (o instanceof ChainedCalendar ccal) {
            editChainedCalendar(manager, ccal, activatedNode);
        } else if (o instanceof CompositeCalendar ocal) {
            editCompositeCalendar(manager, ocal, activatedNode);
        }
    }

    @Override
    protected boolean enable(ItemWsNode activatedNode) {
        CalendarDefinition o = AddCalendarAction.getProvider(activatedNode);
        return (o instanceof Calendar)
                || o instanceof ChainedCalendar
                || o instanceof CompositeCalendar;
    }

    @Override
    public String getName() {
        return Bundle.CTL_EditCalendarAction();
    }

    static void replace(CalendarManager manager, String oldName, String newName, CalendarDefinition newObj, ItemWsNode node) {
        manager.remove(oldName);
        manager.set(newName, newObj);
        WorkspaceItem item = (WorkspaceItem) node.getItem();
        item.setElement(newObj);
        Workspace workspace = node.getWorkspace();
        WorkspaceFactory.Event ev = new WorkspaceFactory.Event(workspace, item.getId(), WorkspaceFactory.Event.ITEMCHANGED, null);
        WorkspaceFactory.getInstance().notifyEvent(ev);
        if (! oldName.equals(newName) ) {
            item.setDisplayName(newName);
            WorkspaceFactory.Event nev = new WorkspaceFactory.Event(workspace, item.getId(), WorkspaceFactory.Event.ITEMRENAMED, null);
            WorkspaceFactory.getInstance().notifyEvent(nev);
        }
    }

    @Messages({
        "editNationalCalendar.dialog.title=Edit National Calendar"
    })
    static void editNationalCalendar(CalendarManager manager, Calendar p, ItemWsNode node) {
        String oldName = manager.get(p);

        NationalCalendarPanel panel = new NationalCalendarPanel();
        panel.setCalendarName(oldName);
        panel.setHolidays(Arrays.asList(p.getHolidays()));
        panel.setMeanCorrection(p.isMeanCorrection());

        DialogDescriptor dd = panel.createDialogDescriptor(Bundle.editNationalCalendar_dialog_title());
        if (DialogDisplayer.getDefault().notify(dd) == NotifyDescriptor.OK_OPTION) {
            String name = panel.getCalendarName();
            Collection events = panel.getHolidays();
            Calendar np = new Calendar(events.toArray(Holiday[]::new), panel.isMeanCorrection());
            replace(manager, oldName, name, np, node);
        }
    }

    @Messages({
        "editChainedCalendar.dialog.title=Edit Chained Gregorian Calendar"
    })
    static void editChainedCalendar(CalendarManager manager, ChainedCalendar p, ItemWsNode node) {
        String oldName = manager.get(p);

        ChainedGregorianCalendarPanel panel = new ChainedGregorianCalendarPanel();
        panel.setCalendarName(oldName);
        panel.setFirstCalendar(p.getFirst());
        panel.setSecondCalendar(p.getSecond());
        panel.setDayBreak(p.getBreakDate());

        DialogDescriptor dd = panel.createDialogDescriptor(Bundle.editChainedCalendar_dialog_title());
        if (DialogDisplayer.getDefault().notify(dd) == NotifyDescriptor.OK_OPTION) {
            String name = panel.getCalendarName();
            String first = panel.getFirstCalendar();
            String second = panel.getSecondCalendar();
            LocalDate dayBreak = panel.getDayBreak();
            replace(manager, oldName, name, new ChainedCalendar(first, second, dayBreak), node);
        }
    }

    @Messages({
        "editCompositeCalendar.dialog.title=Edit Composite Gregorian Calendar"
    })
    static void editCompositeCalendar(CalendarManager manager, CompositeCalendar p, ItemWsNode node) {
        String oldName = manager.get(p);

        CompositeGregorianCalendarPanel panel = new CompositeGregorianCalendarPanel(oldName);
        panel.setWeightedItems(Arrays.asList(p.getCalendars()));

        DialogDescriptor dd = panel.createDialogDescriptor(Bundle.editCompositeCalendar_dialog_title());
        if (DialogDisplayer.getDefault().notify(dd) == NotifyDescriptor.OK_OPTION) {
            String name = panel.getCalendarName();
            List> weightedItems = panel.getWeightedItems();
            CompositeCalendar newObj = new CompositeCalendar(weightedItems.toArray(new WeightedItem[weightedItems.size()]));
            replace(manager, oldName, name, newObj, node);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy