/* GanttProject is an opensource project management tool. Copyright (C) 2003-2011 GanttProject Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.gui; import biz.ganttproject.core.calendar.GanttDaysOff; import biz.ganttproject.core.option.*; import net.sourceforge.ganttproject.CustomPropertyManager; import net.sourceforge.ganttproject.action.CancelAction; import net.sourceforge.ganttproject.action.OkAction; import net.sourceforge.ganttproject.gui.DateIntervalListEditor.DateInterval; import net.sourceforge.ganttproject.gui.DateIntervalListEditor.DefaultDateIntervalModel; import net.sourceforge.ganttproject.gui.options.OptionsPageBuilder; import net.sourceforge.ganttproject.gui.taskproperties.CustomColumnsPanel; import net.sourceforge.ganttproject.language.GanttLanguage; import net.sourceforge.ganttproject.resource.HumanResource; import net.sourceforge.ganttproject.roles.Role; import net.sourceforge.ganttproject.roles.RoleManager; import net.sourceforge.ganttproject.task.TaskManager; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; public class GanttDialogPerson { private final TaskManager myTaskManager; private boolean change; private HumanResource person; private static final GanttLanguage language = GanttLanguage.getInstance(); private JTabbedPane tabbedPane; private final StringOption myNameField = new DefaultStringOption("name"); private final StringOption myPhoneField = new DefaultStringOption("colPhone"); private final StringOption myMailField = new DefaultStringOption("colMail"); private final MoneyOption myStandardRateField = new DefaultMoneyOption("colStandardRate"); private final MoneyOption myTotalCostField = new DefaultMoneyOption("colTotalCost"); private final EnumerationOption myRoleField; private final GPOptionGroup myGroup; private GPOptionGroup myRateGroup; private final UIFacade myUIFacade; private final CustomPropertyManager myCustomPropertyManager; private ResourceAssignmentsPanel myAssignmentsPanel; public GanttDialogPerson(CustomPropertyManager customPropertyManager, TaskManager taskManager, UIFacade uiFacade, HumanResource person) { myCustomPropertyManager = customPropertyManager; myTaskManager = taskManager; myUIFacade = uiFacade; this.person = person; Role[] enabledRoles = RoleManager.Access.getInstance().getEnabledRoles(); String[] roleFieldValues = new String[enabledRoles.length]; for (int i = 0; i < enabledRoles.length; i++) { roleFieldValues[i] = enabledRoles[i].getName(); } myRoleField = new DefaultEnumerationOption<Object>("colRole", roleFieldValues); myGroup = new GPOptionGroup("", new GPOption[]{myNameField, myPhoneField, myMailField, myRoleField}); myGroup.setTitled(false); ((GPAbstractOption)myTotalCostField).setWritable(false); myRateGroup = new GPOptionGroup("resourceRate", new GPOption[] {myStandardRateField, myTotalCostField}); } public boolean result() { return change; } public void setVisible(boolean isVisible) { if (isVisible) { loadFields(); Component contentPane = getComponent(); OkAction okAction = new OkAction() { @Override public void actionPerformed(ActionEvent e) { myGroup.commit(); okButtonActionPerformed(); } }; CancelAction cancelAction = new CancelAction() { @Override public void actionPerformed(ActionEvent e) { myGroup.rollback(); change = false; } }; myUIFacade.createDialog(contentPane, new Action[] { okAction, cancelAction }, language.getCorrectedLabel("human")).show(); } } private void loadFields() { myNameField.setValue(person.getName()); myPhoneField.setValue(person.getPhone()); myMailField.setValue(person.getMail()); Role role = person.getRole(); if (role != null) { myRoleField.setValue(role.getName()); } myStandardRateField.setValue(person.getStandardPayRate()); myTotalCostField.setValue(person.getTotalCost()); } private Component getComponent() { OptionsPageBuilder builder = new OptionsPageBuilder(); OptionsPageBuilder.I18N i18n = new OptionsPageBuilder.I18N() { @Override public String getOptionLabel(GPOptionGroup group, GPOption<?> option) { return getValue(option.getID()); } }; builder.setI18N(i18n); final JComponent mainPage = builder.buildPlanePage(new GPOptionGroup[] { myGroup, myRateGroup }); mainPage.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); tabbedPane = new JTabbedPane(); tabbedPane.addTab(language.getText("general"), new ImageIcon(getClass().getResource("/icons/properties_16.gif")), mainPage); tabbedPane.addTab(language.getText("daysOff"), new ImageIcon(getClass().getResource("/icons/holidays_16.gif")), constructDaysOffPanel()); CustomColumnsPanel customColumnsPanel = new CustomColumnsPanel(myCustomPropertyManager, myUIFacade, person, myUIFacade.getResourceTree().getVisibleFields()); tabbedPane.addTab(language.getText("customColumns"), new ImageIcon(getClass().getResource("/icons/custom.gif")), customColumnsPanel.getComponent()); constructAssignmentsPanel(); tabbedPane.addTab(language.getText("assignments"), new ImageIcon(getClass().getResource("/icons/copy_16.gif")), myAssignmentsPanel.getComponent()); //todo change icon // mainPage.requestDefaultFocus(); // final FocusTraversalPolicy defaultPolicy = // mainPage.getFocusTraversalPolicy(); // FocusTraversalPolicy customPolicy = new FocusTraversalPolicy() { // public Component getComponentAfter(Container aContainer, Component // aComponent) { // return defaultPolicy.getComponentAfter(aContainer, aComponent); // } // // public Component getComponentBefore(Container aContainer, Component // aComponent) { // return defaultPolicy.getComponentBefore(aContainer, aComponent); // } // // public Component getFirstComponent(Container aContainer) { // return defaultPolicy.getFirstComponent(aContainer); // } // // public Component getLastComponent(Container aContainer) { // return defaultPolicy.getLastComponent(aContainer); // } // // public Component getDefaultComponent(Container aContainer) { // return mainPage; // } // }; // //mainPage.setFocusCycleRoot(true); // mainPage.setFocusTraversalPolicy(customPolicy); tabbedPane.addFocusListener(new FocusAdapter() { boolean isFirstTime = true; @Override public void focusGained(FocusEvent e) { if (isFirstTime) { mainPage.requestFocus(); isFirstTime = false; } super.focusGained(e); } }); return tabbedPane; } private void constructAssignmentsPanel() { myAssignmentsPanel = new ResourceAssignmentsPanel(person, myTaskManager); } private void okButtonActionPerformed() { if (person.getId() != -1) { // person ID is -1 when it is new one // i.e. before the Person dialog is closed myUIFacade.getUndoManager().undoableEdit("Resource properties changed", new Runnable() { @Override public void run() { applyChanges(); } }); } else { applyChanges(); } change = true; } private void applyChanges() { person.setName(myNameField.getValue()); person.setMail(myMailField.getValue()); person.setPhone(myPhoneField.getValue()); Role role = findRole(myRoleField.getValue()); if (role != null) { person.setRole(role); } person.getDaysOff().clear(); for (DateInterval interval : myDaysOffModel.getIntervals()) { person.addDaysOff(new GanttDaysOff(interval.start, interval.getEnd())); } person.setStandardPayRate(myStandardRateField.getValue()); myAssignmentsPanel.commit(); // FIXME change = false;? (after applying changed they are not changes // anymore...) } private Role findRole(String roleName) { Role[] enabledRoles = RoleManager.Access.getInstance().getEnabledRoles(); for (Role enabledRole : enabledRoles) { if (enabledRole.getName().equals(roleName)) { return enabledRole; } } return null; } private DefaultDateIntervalModel myDaysOffModel; public JPanel constructDaysOffPanel() { myDaysOffModel = new DateIntervalListEditor.DefaultDateIntervalModel() { @Override public int getMaxIntervalLength() { return 2; } @Override public void add(DateInterval interval) { super.add(interval); } @Override public void remove(DateInterval interval) { super.remove(interval); } }; DefaultListModel daysOff = person.getDaysOff(); for (int i = 0; i < daysOff.getSize(); i++) { GanttDaysOff next = (GanttDaysOff) daysOff.get(i); myDaysOffModel.add(DateIntervalListEditor.DateInterval.createFromModelDates(next.getStart().getTime(), next.getFinish().getTime())); } DateIntervalListEditor editor = new DateIntervalListEditor(myDaysOffModel); return editor; } }