ca.qc.cegepoutaouais.tge.pige.client.ui.dialog.ItemCEVDialog.java Source code

Java tutorial

Introduction

Here is the source code for ca.qc.cegepoutaouais.tge.pige.client.ui.dialog.ItemCEVDialog.java

Source

/*
 * Copyright 2010, 2011 Renaud Brub
 *
 * This file is part of PIGE.
 *
 * PIGE 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.
 *
 * PIGE 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 PIGE.  If not, see <http://www.gnu.org/licenses/>.
 */
package ca.qc.cegepoutaouais.tge.pige.client.ui.dialog;

import ca.qc.cegepoutaouais.tge.pige.client.ItemStatus;
import ca.qc.cegepoutaouais.tge.pige.client.ItemStatus.ItemStatusModel;
import ca.qc.cegepoutaouais.tge.pige.client.PIGE;
import ca.qc.cegepoutaouais.tge.pige.client.services.ManagementServiceAsync;
import ca.qc.cegepoutaouais.tge.pige.client.ui.AppEvents;
import ca.qc.cegepoutaouais.tge.pige.client.ui.AppWidgets;
import ca.qc.cegepoutaouais.tge.pige.client.ui.widget.CategoryBrowser;
import ca.qc.cegepoutaouais.tge.pige.client.ui.widget.EditorMode;
import ca.qc.cegepoutaouais.tge.pige.client.ui.widget.StatusBar;
import ca.qc.cegepoutaouais.tge.pige.dao.pojos.Category;
import ca.qc.cegepoutaouais.tge.pige.dao.pojos.Item;
import ca.qc.cegepoutaouais.tge.pige.dao.pojos.Maintenance;
import ca.qc.cegepoutaouais.tge.pige.dao.pojos.Role;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.ModelProcessor;
import com.extjs.gxt.ui.client.data.TreeModel;
import com.extjs.gxt.ui.client.dnd.DND.Operation;
import com.extjs.gxt.ui.client.dnd.ListViewDropTarget;
import com.extjs.gxt.ui.client.dnd.TreeGridDragSource;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.DNDEvent;
import com.extjs.gxt.ui.client.event.DNDListener;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MenuEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.widget.Html;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.TabPanel;
import com.extjs.gxt.ui.client.widget.form.AdapterField;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.ListField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextArea;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.BoxLayout.BoxLayoutPack;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayout;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayout.VBoxLayoutAlign;
import com.extjs.gxt.ui.client.widget.menu.HeaderMenuItem;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 *
 * @author Renaud Brub
 */
public class ItemCEVDialog extends AbstractCEVDialog {

    Timer nameAutoCompleteTimer = new Timer() {

        @Override
        public void run() {
            ManagementServiceAsync rpcService = (ManagementServiceAsync) Registry.get(PIGE.MANAGEMENT_SERVICE);
            rpcService.getItemNameSuggestion(nameTF.getValue(), new AsyncCallback<String>() {

                @Override
                public void onSuccess(String result) {
                    if (result == null) {
                        return;
                    }
                    String start = nameTF.getValue();
                    if (start.length() <= 0) {
                        return;
                    }
                    int len = start.length();
                    nameTF.setValue(result);
                    nameTF.setSelectionRange(len, result.length());
                }

                @Override
                public void onFailure(Throwable caught) {
                    // Silent.
                }
            });
        }
    };

    protected TextField<String> nameTF = null;
    protected TextField<String> serialNumberTF = null;
    protected TextField<String> modelTF = null;
    protected TextField<String> versionTF = null;
    protected NumberField quantityNF = null;
    protected TextField<String> locationTF = null;

    protected ComboBox typeCBx = null;
    protected ComboBox<ItemStatusModel> statusCBx = null;
    protected ListStore<ItemStatusModel> statusListStore = null;

    protected DateField creationDateDF = null;
    protected DateField receptionDateDF = null;
    protected DateField endOfLifeDateDF = null;

    protected TextArea descriptionTA = null;
    protected TextArea dataSheetTA = null;
    protected ListField<BeanModel> selectedCategoriesLF = null;
    protected AdapterField catEditorAF = null;

    protected TextArea reqPOTA = null;
    protected TextArea supplierTA = null;
    protected TextArea internetAddress = null;
    protected TextArea otherOrderInfos = null;

    protected ListViewDropTarget listViewDT = null;
    protected TreeGridDragSource treeGridDS = null;

    protected ListField<BeanModel> maintenancesLF = null;
    protected ListStore<BeanModel> maintenanceStore = null;

    private long typeTimestamp = 0;
    protected long autoCompleteDelay = 3000; // 3 secondes.

    //public ItemCEVDialog() {
    //    setupUI();
    //}

    public ItemCEVDialog(CEV cevType) {
        super(cevType);
        setupUI();
    }

    protected void setupUI() {

        // Configurations de la bote de dialogue.
        setLayout(new FitLayout());
        setModal(true);
        setDraggable(true);
        setCollapsible(false);
        setClosable(true);
        setAutoHide(false);
        setResizable(false);
        setBodyStyle("padding: 3px");
        setWidth(600);
        setHeight(500);

        TabPanel tabPanel = new TabPanel();

        tabPanel.add(createIdentificationTab());
        tabPanel.add(createCategoriesTab());

        Role role = Registry.get(PIGE.ROLE_OBJECT);
        if (role.getManageInventory()) {
            tabPanel.add(createOrderInfosTab());
            if (cevType.equals(CEV.VIEW)) {
                tabPanel.add(createMaintenancesTab());
            }
        }

        add(tabPanel);

    }

    protected TabItem createIdentificationTab() {

        TabItem tab = new TabItem(messages.identification());

        FormPanel formPanel = new FormPanel();
        formPanel.setHeaderVisible(false);
        formPanel.setBodyBorder(false);
        FormData formData = new FormData("100%");
        tab.add(formPanel);

        LayoutContainer topPanel = new LayoutContainer();
        topPanel.setLayout(new ColumnLayout());
        formPanel.add(topPanel, formData);
        LayoutContainer leftPanel = new LayoutContainer();
        FormLayout formLayout = new FormLayout();
        formLayout.setLabelAlign(LabelAlign.TOP);
        leftPanel.setLayout(formLayout);
        leftPanel.setStyleAttribute("padding-right", "18px");
        LayoutContainer rightPanel = new LayoutContainer();
        rightPanel.setStyleAttribute("padding-right", "18px");
        formLayout = new FormLayout();
        formLayout.setLabelAlign(LabelAlign.TOP);
        rightPanel.setLayout(formLayout);
        topPanel.add(leftPanel, new ColumnData(.5));
        topPanel.add(rightPanel, new ColumnData(.5));
        LayoutContainer bottomPanel = new LayoutContainer();
        formLayout = new FormLayout();
        formLayout.setLabelAlign(LabelAlign.TOP);
        bottomPanel.setLayout(formLayout);
        formPanel.add(bottomPanel, formData);

        KeyListener keyListener = new KeyListener() {

            @Override
            public void componentKeyUp(ComponentEvent event) {
                validate();
            }
        };

        nameTF = new TextField<String>();
        nameTF.setFieldLabel(messages.name());
        nameTF.addKeyListener(keyListener);
        nameTF.setAllowBlank(Boolean.FALSE);
        nameTF.setMaxLength(100);
        nameTF.setEmptyText(messages.requiredField());
        nameTF.addKeyListener(new KeyListener() {

            @Override
            public void componentKeyUp(ComponentEvent event) {
                int key = event.getKeyCode();
                nameAutoCompleteTimer.cancel();
                if (key < 0x40 || key > 0x7E) {
                    return;
                }
                nameAutoCompleteTimer.schedule(1000);
            }
        });

        serialNumberTF = new TextField<String>();
        serialNumberTF.setFieldLabel(messages.serialNumber());
        serialNumberTF.setMaxLength(50);
        serialNumberTF.addKeyListener(keyListener);
        modelTF = new TextField<String>();
        modelTF.setFieldLabel(messages.model());
        modelTF.setMaxLength(50);
        modelTF.addKeyListener(keyListener);
        versionTF = new TextField<String>();
        versionTF.setFieldLabel(messages.version());
        versionTF.setMaxLength(30);
        versionTF.addKeyListener(keyListener);
        quantityNF = new NumberField();
        quantityNF.setFormat(NumberFormat.getFormat(PIGE.QUANTITY_FORMAT));
        quantityNF.setPropertyEditorType(Integer.class);
        quantityNF.setAllowBlank(Boolean.FALSE);
        quantityNF.setAllowDecimals(Boolean.FALSE);
        quantityNF.setAllowNegative(Boolean.FALSE);
        quantityNF.setMaxLength(9);
        quantityNF.setFieldLabel(messages.quantity());
        quantityNF.setEmptyText(messages.requiredField());
        quantityNF.addKeyListener(keyListener);

        locationTF = new TextField<String>();
        locationTF.setFieldLabel(messages.location());
        locationTF.setMaxLength(255);
        locationTF.setEmptyText(messages.requiredField());
        locationTF.setAllowBlank(Boolean.FALSE);
        locationTF.addKeyListener(keyListener);

        statusListStore = new ListStore<ItemStatusModel>();
        statusCBx = new ComboBox<ItemStatusModel>();
        statusCBx.setStore(statusListStore);
        statusCBx.setFieldLabel(messages.status());
        statusCBx.setEmptyText(messages.requiredField());
        statusCBx.setAllowBlank(Boolean.FALSE);
        statusCBx.setForceSelection(true);
        statusCBx.setEditable(false);
        statusCBx.setDisplayField("label");
        statusCBx.setTriggerAction(TriggerAction.ALL);
        statusCBx.addListener(Events.Select, new Listener<FieldEvent>() {

            @Override
            public void handleEvent(FieldEvent event) {
                validate();
            }
        });

        DateTimeFormat dtf = DateTimeFormat.getFormat(PIGE.TERM_DATE_FORMAT);

        creationDateDF = new DateField();
        creationDateDF.setFieldLabel(messages.creationDate());
        creationDateDF.setReadOnly(Boolean.TRUE);
        creationDateDF.setFormatValue(Boolean.TRUE);
        creationDateDF.getPropertyEditor().setFormat(dtf);
        creationDateDF.setEditable(Boolean.FALSE);//Test
        creationDateDF.setHideTrigger(Boolean.TRUE);

        receptionDateDF = new DateField();
        receptionDateDF.setFieldLabel(messages.receptionDate());
        receptionDateDF.setFormatValue(Boolean.TRUE);
        receptionDateDF.setEditable(Boolean.FALSE);
        receptionDateDF.getPropertyEditor().setFormat(dtf);

        endOfLifeDateDF = new DateField();
        endOfLifeDateDF.setFieldLabel(messages.endOfLifeDate());
        endOfLifeDateDF.setFormatValue(Boolean.TRUE);
        endOfLifeDateDF.setEditable(Boolean.FALSE);
        endOfLifeDateDF.getPropertyEditor().setFormat(dtf);

        dataSheetTA = new TextArea();
        dataSheetTA.setFieldLabel(messages.dataSheets());
        dataSheetTA.setHeight(40);
        dataSheetTA.addKeyListener(keyListener);

        descriptionTA = new TextArea();
        descriptionTA.setFieldLabel(messages.description());
        descriptionTA.setHeight(90);
        descriptionTA.addKeyListener(keyListener);

        leftPanel.add(nameTF, formData);
        leftPanel.add(locationTF, formData);
        leftPanel.add(modelTF, formData);
        leftPanel.add(versionTF, formData);
        leftPanel.add(receptionDateDF, formData);

        rightPanel.add(quantityNF, formData);
        rightPanel.add(statusCBx, formData);
        rightPanel.add(serialNumberTF, formData);
        rightPanel.add(creationDateDF, formData);
        rightPanel.add(endOfLifeDateDF, formData);

        bottomPanel.add(dataSheetTA, formData);
        bottomPanel.add(descriptionTA, formData);

        statusListStore.add(ItemStatus.getInstance().getModelList());

        return tab;
    }

    protected TabItem createCategoriesTab() {

        TabItem tab = new TabItem(messages.categories());

        FormPanel formPanel = new FormPanel();
        formPanel.setHeaderVisible(false);
        formPanel.setBodyBorder(false);
        tab.add(formPanel);
        LayoutContainer mainPanel = new LayoutContainer();
        mainPanel.setLayout(new ColumnLayout());
        FormData formData = new FormData("100%");
        formPanel.add(mainPanel, formData);
        formPanel.add(new Html(messages.contextualMenuTip()), formData);

        LayoutContainer leftPanel = new LayoutContainer();
        FormLayout formLayout = new FormLayout();
        formLayout.setLabelAlign(LabelAlign.TOP);
        leftPanel.setLayout(formLayout);
        leftPanel.setStyleAttribute("padding-right", "5px");
        LayoutContainer middlePanel = new LayoutContainer();
        VBoxLayout layout = new VBoxLayout();
        layout.setVBoxLayoutAlign(VBoxLayoutAlign.CENTER);
        layout.setPack(BoxLayoutPack.CENTER);
        middlePanel.setLayout(layout);
        LayoutContainer rightPanel = new LayoutContainer();
        rightPanel.setStyleAttribute("padding-left", "5px");
        formLayout = new FormLayout();
        formLayout.setLabelAlign(LabelAlign.TOP);
        rightPanel.setLayout(formLayout);

        mainPanel.add(leftPanel, new ColumnData(.45));
        mainPanel.add(middlePanel, new ColumnData(10));
        mainPanel.add(rightPanel, new ColumnData(.55));

        middlePanel.setHeight(350);
        middlePanel.addText(">");

        Role role = Registry.get(PIGE.ROLE_OBJECT);
        EditorMode mode = EditorMode.ReadOnly;
        if (role.getManageInventory() && cevType != CEV.VIEW) {
            mode = EditorMode.Normal;
        }
        CategoryBrowser catBrowser = new CategoryBrowser(mode);
        catBrowser.setIncludeUnclassifiedCategory(Boolean.FALSE);
        catBrowser.setShowItemCount(Boolean.FALSE);
        TreeGrid treeGrid = catBrowser.getTreeGrid();
        treeGrid.setHeight(337);
        treeGridDS = new TreeGridDragSource(treeGrid);
        treeGrid.getTreeStore().addStoreListener(new StoreListener<BeanModel>() {

            @Override
            public void storeUpdate(StoreEvent<BeanModel> event) {
                super.storeUpdate(event);
                selectedCategoriesLF.getStore().update(event.getModel());
            }
        });
        catEditorAF = new AdapterField(catBrowser);
        catEditorAF.setHideLabel(Boolean.TRUE);

        selectedCategoriesLF = new ListField<BeanModel>();
        selectedCategoriesLF.setHeight(340);
        selectedCategoriesLF.setStore(new ListStore<BeanModel>());
        selectedCategoriesLF.getListView().getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        selectedCategoriesLF.setDisplayField("view");
        selectedCategoriesLF.setFieldLabel(messages.classification());
        selectedCategoriesLF.getListView().setModelProcessor(new ModelProcessor<BeanModel>() {

            @Override
            public BeanModel prepareData(BeanModel model) {
                Category c = model.<Category>getBean();
                StringBuilder b = new StringBuilder();
                b.append("<span qtip='").append(c.getPath()).append("'>").append(c.getPath()).append("</span>");
                model.set("view", b.toString());
                return model;
            }
        });

        if (mode == EditorMode.Normal) {
            selectedCategoriesLF.addKeyListener(new KeyListener() {

                @Override
                public void componentKeyUp(ComponentEvent event) {
                    if (event.getKeyCode() == KeyCodes.KEY_DELETE) {
                        BeanModel selection = selectedCategoriesLF.getListView().getSelectionModel()
                                .getSelectedItem();
                        if (selection != null) {
                            selectedCategoriesLF.getStore().remove(selection);
                        }
                    }
                }
            });
            if (cevType != CEV.VIEW) {
                Menu contextMenu = new Menu();
                contextMenu.add(new HeaderMenuItem(messages.classificationMenu()));
                MenuItem deleteCategoryBtn = new MenuItem(messages.delete());
                deleteCategoryBtn.addSelectionListener(new SelectionListener<MenuEvent>() {

                    @Override
                    public void componentSelected(MenuEvent event) {
                        BeanModel selection = selectedCategoriesLF.getListView().getSelectionModel()
                                .getSelectedItem();
                        if (selection != null) {
                            selectedCategoriesLF.getStore().remove(selection);
                        }
                    }
                });
                contextMenu.add(deleteCategoryBtn);
                selectedCategoriesLF.setContextMenu(contextMenu);
            }
        }

        listViewDT = new ListViewDropTarget(selectedCategoriesLF.getListView()) {

            @Override
            protected void onDragDrop(DNDEvent e) {
                List<TreeModel> list = e.getData();
                BeanModel model = (BeanModel) list.iterator().next().get("model");
                if (categoryExists(model)) {
                    e.setCancelled(Boolean.TRUE);
                } else {
                    super.onDragDrop(e);
                }
            }
        };
        listViewDT.setOperation(Operation.COPY);
        listViewDT.addDNDListener(new DNDListener() {

            @Override
            public void dragEnter(DNDEvent e) {
                List<TreeModel> list = e.getData();
                BeanModel model = (BeanModel) list.iterator().next().get("model");
                if (categoryExists(model)) {
                    e.getStatus().setStatus(Boolean.FALSE);
                    e.setCancelled(Boolean.TRUE);
                } else {
                    super.dragEnter(e);
                }
            }
        });

        leftPanel.add(catEditorAF, formData);

        rightPanel.add(selectedCategoriesLF, formData);

        return tab;
    }

    protected TabItem createMaintenancesTab() {
        TabItem tab = new TabItem(messages.maintenances());

        maintenancesLF = new ListField<BeanModel>();
        maintenancesLF.setFieldLabel(messages.affectedByFollowingMaintenances());
        maintenancesLF.getListView().getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
        maintenancesLF.setDisplayField("name");
        maintenanceStore = new ListStore();
        maintenancesLF.setStore(maintenanceStore);
        maintenancesLF.setHeight(340);

        maintenancesLF.getListView().addListener(Events.OnDoubleClick, new Listener<BaseEvent>() {

            @Override
            public void handleEvent(BaseEvent be) {
                viewMaintenance();
            };
        });

        FormPanel formPanel = new FormPanel();
        formPanel.setHeaderVisible(false);
        formPanel.setBodyBorder(false);
        formPanel.setLabelAlign(LabelAlign.TOP);
        FormData formData = new FormData("100%");
        formPanel.add(maintenancesLF, formData);
        formPanel.add(new Html(messages.contextualMenuTip()), formData);
        tab.add(formPanel);

        Menu menu = new Menu();
        menu.add(new HeaderMenuItem(messages.maintenanceMenu()));
        MenuItem viewMaintenanceMenu = new MenuItem(messages.view() + PIGE.DIALOG_OPENER_INDICATOR);
        viewMaintenanceMenu.addSelectionListener(new SelectionListener() {

            @Override
            public void componentSelected(ComponentEvent ce) {
                viewMaintenance();
            }
        });
        menu.add(viewMaintenanceMenu);
        maintenancesLF.setContextMenu(menu);

        return tab;
    }

    protected TabItem createOrderInfosTab() {
        TabItem tab = new TabItem(messages.orderInfos());

        FormPanel formPanel = new FormPanel();
        formPanel.setLabelAlign(LabelAlign.TOP);
        formPanel.setHeaderVisible(false);
        formPanel.setBodyBorder(false);
        tab.add(formPanel);

        FormData formData = new FormData("100%");

        reqPOTA = new TextArea();
        reqPOTA.setFieldLabel(messages.requisitionPONumber());
        reqPOTA.setHeight(75);
        supplierTA = new TextArea();
        supplierTA.setFieldLabel(messages.supplier());
        supplierTA.setHeight(75);
        internetAddress = new TextArea();
        internetAddress.setFieldLabel(messages.internetAddresses());
        internetAddress.setHeight(75);
        otherOrderInfos = new TextArea();
        otherOrderInfos.setFieldLabel(messages.otherInformation());
        otherOrderInfos.setHeight(70);

        formPanel.add(reqPOTA, formData);
        formPanel.add(supplierTA, formData);
        formPanel.add(internetAddress, formData);
        formPanel.add(otherOrderInfos, formData);

        return tab;
    }

    protected void viewMaintenance() {
        List<BeanModel> selection = maintenancesLF.getSelection();
        if (selection.size() > 0) {
            MaintenanceCEVDialog dialog = new MaintenanceCEVDialog(CEV.VIEW);
            dialog.setData("maintenance", (Maintenance) selection.get(0).getBean());
            dialog.showDialog();
        } else {
            MessageBox.info(messages.information(), messages.noMaintenanceSelected(), null);
        }
    }

    protected Boolean categoryExists(BeanModel category) {
        ListStore store = selectedCategoriesLF.getStore();
        List<ModelData> models = store.getModels();
        BeanModel model;
        for (ModelData md : models) {
            model = (BeanModel) md;
            if (((String) category.get("path")).equals(model.get("path"))) {
                return Boolean.TRUE;
            }
        }
        return Boolean.FALSE;
    }

    @Override
    protected void initialize() {
        if (cevType == CEV.CREATE || cevType == CEV.COPY) {
            creationDateDF.setValue(new Date());
            if (cevType == CEV.CREATE) {
                //statusCBx.setValue(statusCBx.getStore().findModel(
                //        ItemStatus.getInstance().getModel(
                //            ItemStatus.STATUS_IN_STOCK).getValue()));
                /*
                 * Slectionner l'tat de la liste droulante correspondant  l'tat
                 * 'En stock'.
                 */
                ListStore<ItemStatusModel> store = statusCBx.getStore();
                int listSize = store.getCount();
                ItemStatusModel model;
                for (int i = 0; i < listSize; ++i) {
                    model = store.getAt(i);
                    if (model.getValue().equalsIgnoreCase(ItemStatus.STATUS_IN_STOCK)) {
                        statusCBx.setValue(model);
                        break;
                    }
                }
            }
        }
    }

    @Override
    protected void clearFields() {
        nameTF.clear();
        serialNumberTF.clear();
        modelTF.clear();
        versionTF.clear();
        quantityNF.clear();
        locationTF.clear();
        receptionDateDF.clear();
        endOfLifeDateDF.clear();
        dataSheetTA.clear();
        descriptionTA.clear();

        selectedCategoriesLF.clear();

        Role role = Registry.get(PIGE.ROLE_OBJECT);
        if (role.getManageInventory()) {
            if (cevType.equals(CEV.VIEW)) {
                maintenancesLF.clear();
            }
            reqPOTA.clear();
            supplierTA.clear();
            internetAddress.clear();
            otherOrderInfos.clear();
        }

    }

    @Override
    protected void fillFields() {
        Item item = getData("item");
        if (item != null) {
            nameTF.setValue(item.getName());
            serialNumberTF.setValue(item.getSerialNumber());
            modelTF.setValue(item.getModel());
            versionTF.setValue(item.getVersion());
            quantityNF.setValue(item.getQuantity());
            locationTF.setValue(item.getLocation());
            creationDateDF.setValue(item.getCreationDate());
            receptionDateDF.setValue(item.getReceptionDate());
            endOfLifeDateDF.setValue(item.getEndOfLifeDate());
            dataSheetTA.setValue(item.getDataSheet());
            descriptionTA.setValue(item.getDescription());

            Role role = Registry.get(PIGE.ROLE_OBJECT);
            if (role.getManageInventory()) {

                if (cevType.equals(CEV.VIEW)) {
                    Set<Maintenance> maintenances = item.getMaintenances();
                    if (maintenances != null) {
                        BeanModelFactory factory = BeanModelLookup.get().getFactory(Maintenance.class);
                        ListStore maintStore = maintenancesLF.getStore();
                        maintStore.removeAll();
                        for (Maintenance m : maintenances) {
                            maintStore.add(factory.createModel(m));
                        }
                    }
                }

                reqPOTA.setValue(item.getReqPONumbers());
                supplierTA.setValue(item.getSuppliers());
                internetAddress.setValue(item.getInternetAddresses());
                otherOrderInfos.setValue(item.getOtherOrderInfos());
            }

            /*
             * Slectionner l'tat de la liste droulante correspondant  l'tat
             * de l'item.
             */
            String itemStatus = item.getStatus();
            ListStore<ItemStatusModel> store = statusCBx.getStore();
            int listSize = store.getCount();
            ItemStatusModel model;
            for (int i = 0; i < listSize; ++i) {
                model = store.getAt(i);
                if (model.getValue().equalsIgnoreCase(itemStatus)) {
                    statusCBx.setValue(model);
                    break;
                }
            }

            Set<Category> categories = item.getCategories();
            if (categories != null) {
                BeanModelFactory factory = BeanModelLookup.get().getFactory(Category.class);
                ListStore categoryStore = selectedCategoriesLF.getStore();
                categoryStore.removeAll();
                for (Category c : categories) {
                    categoryStore.add(factory.createModel(c));
                }
            }
        }
    }

    @Override
    protected void setReadOnly(Boolean b) {
        nameTF.setReadOnly(b);
        serialNumberTF.setReadOnly(b);
        modelTF.setReadOnly(b);
        versionTF.setReadOnly(b);
        quantityNF.setReadOnly(b);
        locationTF.setReadOnly(b);
        statusCBx.setReadOnly(b);
        receptionDateDF.setReadOnly(b);
        endOfLifeDateDF.setReadOnly(b);
        dataSheetTA.setReadOnly(b);
        descriptionTA.setReadOnly(b);

        selectedCategoriesLF.setReadOnly(b);
        if (b) {
            listViewDT.disable();
        } else {
            listViewDT.enable();
        }

        catEditorAF.setReadOnly(b);
        if (b) {
            treeGridDS.disable();
        } else {
            treeGridDS.enable();
        }

        Role role = Registry.get(PIGE.ROLE_OBJECT);
        if (role.getManageInventory()) {
            reqPOTA.setReadOnly(b);
            supplierTA.setReadOnly(b);
            internetAddress.setReadOnly(b);
            otherOrderInfos.setReadOnly(b);
        }
    }

    @Override
    protected void setupWindow() {
        if (cevType.equals(CEV.VIEW)) {
            setHeadingText(messages.viewItem() + " (" + messages.readOnly() + ")");
        } else if (cevType.equals(CEV.EDIT)) {
            setHeadingText(messages.editItem());
        } else if (cevType.equals(CEV.CREATE)) {
            setHeadingText(messages.createItem());
        } else if (cevType.equals(CEV.COPY)) {
            setHeadingText(messages.createItem());
        }
    }

    @Override
    protected void validate() {
        if (cevType.equals(CEV.VIEW)) {
            return;
        }
        boolean isValid = hasValue(nameTF) && hasValue(locationTF) && quantityNF.validate()
                && statusCBx.getRawValue() != null && !statusCBx.getRawValue().isEmpty();
        if (cevType.equals(CEV.CREATE) || cevType.equals(CEV.COPY)) {
            createBtn.setEnabled(isValid);
        } else {
            updateBtn.setEnabled(isValid);
        }
    }

    @Override
    protected void showHelp() {
        MessageBox.info(messages.information(), messages.itemDialogHelp(), null);
    }

    protected Item buildItem(Item baseItem) {
        baseItem.setName(nameTF.getValue());
        baseItem.setSerialNumber(serialNumberTF.getValue());
        baseItem.setModel(modelTF.getValue());
        baseItem.setVersion(versionTF.getValue());
        baseItem.setQuantity((Integer) quantityNF.getValue());
        baseItem.setLocation(locationTF.getValue());
        baseItem.setCreationDate(creationDateDF.getValue());
        baseItem.setReceptionDate(receptionDateDF.getValue());
        baseItem.setEndOfLifeDate(endOfLifeDateDF.getValue());
        baseItem.setDataSheet(dataSheetTA.getValue());
        baseItem.setDescription(descriptionTA.getValue());
        baseItem.setStatus(statusCBx.getValue().getValue());
        baseItem.setReqPONumbers(reqPOTA.getValue());
        baseItem.setSuppliers(supplierTA.getValue());
        baseItem.setInternetAddresses(internetAddress.getValue());
        baseItem.setOtherOrderInfos(otherOrderInfos.getValue());
        Set categories = new HashSet();
        List<BeanModel> list = selectedCategoriesLF.getStore().getModels();
        for (BeanModel bm : list) {
            categories.add((Category) bm.getBean());
        }
        baseItem.setCategories(categories);
        return baseItem;
    }

    @Override
    protected void create() {

        // Nouvel item sans id.
        Item item = buildItem(new Item());

        // Envoyer la demande de cration de compte au serveur.
        ManagementServiceAsync rpcService = Registry.get(PIGE.MANAGEMENT_SERVICE);
        rpcService.createItem(item, new AsyncCallback() {

            @Override
            public void onSuccess(Object o) {
                clearFields();
                validate();
                StatusBar statusBar = Registry.get(AppWidgets.APP_STATUS_BAR);
                statusBar.setTimedText(messages.itemCreatedSuccessfully());
                setFocusWidget(nameTF);
                Dispatcher.get().dispatch(AppEvents.INVENTORY_MANAGEMENT_UPDATE_EVENT);

            }

            @Override
            public void onFailure(Throwable caught) {
                PIGE.handleException(caught);
            }
        });
    }

    @Override
    protected void update() {

        // Rcuprer l'item avec un id valide.
        Item item = buildItem((Item) getData("item"));

        final List<BeanModel> models = selectedCategoriesLF.getStore().getModels();

        // Envoyer la demande de cration de compte au serveur.
        ManagementServiceAsync rpcService = Registry.get(PIGE.MANAGEMENT_SERVICE);
        rpcService.updateItems(Arrays.asList(item), new AsyncCallback() {

            @Override
            public void onSuccess(Object o) {
                StatusBar statusBar = Registry.get(AppWidgets.APP_STATUS_BAR);
                statusBar.setTimedText(messages.updateSuccessful());
                setFocusWidget(nameTF);
                AppEvent event = new AppEvent(AppEvents.INVENTORY_MANAGEMENT_UPDATE_EVENT);
                event.setData("category-update", models);
                Dispatcher.get().dispatch(event);
            }

            @Override
            public void onFailure(Throwable caught) {
                PIGE.handleException(caught);
            }
        });
    }

    protected String autoCompleteResult = null;

    protected void setAutoCompleteResult(String result) {
        autoCompleteResult = result;
    }

    protected String getAutoCompleteResult() {
        return autoCompleteResult;
    }

    protected void queryAutoCompleteResult() {
        ManagementServiceAsync rpcService = (ManagementServiceAsync) Registry.get(PIGE.MANAGEMENT_SERVICE);
        rpcService.getItemNameSuggestion(nameTF.getValue(), new AsyncCallback<String>() {

            @Override
            public void onSuccess(String result) {
                //if (result == null) {
                //    return;
                //}
                //String start = nameTF.getValue();
                //if (start.length() <= 0) {
                //    return;
                //}
                //int len = start.length();
                //nameTF.setValue(result);
                //nameTF.setSelectionRange(len, result.length());
                setAutoCompleteResult(result);
            }

            @Override
            public void onFailure(Throwable caught) {
                // Silent.
            }
        });

    }

}