⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qformcontrollerimpl.java

📁 CRM源码This file describes some issues that should be implemented in future and how it should be imple
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * Copyright 2006-2007 Queplix Corp.
 *
 * Licensed under the Queplix Public License, Version 1.1.1 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.queplix.com/solutions/commercial-open-source/queplix-public-license/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.queplix.core.client.controls.form;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Widget;
import com.queplix.core.client.i18n.I18N;
import com.queplix.core.client.app.vo.FieldData;
import com.queplix.core.client.app.vo.FieldDataRequest;
import com.queplix.core.client.app.vo.FieldMeta;
import com.queplix.core.client.app.vo.FieldOnDemandData;
import com.queplix.core.client.app.vo.TextboxFieldData;
import com.queplix.core.client.common.event.Event;
import com.queplix.core.client.common.event.EventListener;
import com.queplix.core.client.common.event.EventSource;
import com.queplix.core.client.common.ui.DialogHelper;
import com.queplix.core.client.controls.DataRequirementsListener;
import com.queplix.core.client.controls.QButton;
import com.queplix.core.client.controls.QFormElement;
import com.queplix.core.client.controls.QFormElementView;
import com.queplix.core.client.controls.form.event.FormStateChangedData;
import com.queplix.core.client.controls.memo.QMemo;
import com.queplix.core.client.frames.mainframe.FormState;

import java.util.ArrayList;

/**
 * QueWeb QForm Controller Implementation
 * @author Sergey Kozmin
 * @since 21 Sep 2006
 */
class QFormControllerImpl implements QFormController, QModelStateListener, 
        DataRequirementsListener {

    private static final String INCORRECT_STATE_CHANGE = "Internal error. Unit wants to change to uncknown QForm state. ";
    
    private QFormViewImpl view;
    private QFormModelImpl model;
    
    private QFormState searchState = new SearchFormState();
    private QFormState selectedState = new SelectedFormState();
    private QFormState newState = new NewFormState();
    private QFormState editState = new EditFormState();
    private QFormState reportDesignState = new ReportDesignFormState();
    private QFormState previousState = new PreviousFormState();
    
    private QFormState currentState;
    
    /**
     * list that holds units of chain. Class implements "Chain of Responsibility" pattern
     * to handle responses from server.
     */
    private ArrayList unitsList = new ArrayList();
    private ActionContext context = new ActionContext();

    // -------------------- public events ------------------------
    private EventSource eventSource;

    public EventSource getEventSource() {
        return eventSource;
    }
    // ----------------- end of public events --------------------
    
    public QFormControllerImpl(QFormViewImpl view, final QFormModelImpl model) {
        this.view = view;
        this.model = model;
        currentState = searchState;
        currentState.enterToState(QFormState.SEARCH_STATE);
        //view.addActionListener(this);
        view.setDataRequirementsListener(this);
        model.addStateListener(this);
        model.addDataListener(new QFormDataListener() {
            public void dataStructureChanged() {
                currentState.enterToState(previousState.getState());
            }
            
            public void dataChanged() {
            }

            public void dataChanged(String elementId) {
            }

            public void dataOnDemandCome(FieldOnDemandData data) {
            }
        });
        eventSource = new EventSource(view);
        view.getContextMenuEventSource().addEventListener(new EventListener() {
            public void onEvent(Event event, Widget sender) {
                onContextMenuEvent(event);
            }
        });
        view.getFormElementsEventSource().addEventListener(new EventListener() {
            public void onEvent(Event event, Widget sender) {
                if(event == QFormElementView.Events.FORM_ELEMENT_REPORT_DESIGN_EVENT) {
                    onFormElementReportDesignEvent(event);
                } else if (event == Events.FORM_NEW_BUTTON_EVENT ||
                        event == Events.FORM_UPDATE_BUTTON_EVENT ||
                        event == Events.FORM_CHANGE_BUTTON_EVENT ||
                        event == Events.FORM_CLEAR_BUTTON_EVENT ||
                        event == Events.FORM_SEARCH_BUTTON_EVENT) {
                    if(event == Events.FORM_CLEAR_BUTTON_EVENT) {
                        //select form before clean event, do not move from here
                        QFormController.Events.FORM_SELECTION_REQUESTED_EVENT.setData(model.getIndex());
                        eventSource.fireEvent(QFormController.Events.FORM_SELECTION_REQUESTED_EVENT);
                    }
                    performAction(event);
                } else if (event.getData() != null && event.getData() instanceof QButton.CustomButtonEventData) {
                    Event customButtonEvent = QFormController.Events.FORM_CUSTOM_BUTTON;
                    customButtonEvent.setData(event.getData());
                    customButtonEvent.setUserGenerated(true);
                    fireExternalEvent(customButtonEvent, true);
                    customButtonEvent.setUserGenerated(false); // reset to a safe value
                }else {
                    fireExternalEvent(event, true);
                }
            }
        });
    }
    
    public int getCurrentState() {
        return currentState.getState();
    }

    public String getRecordEditingMessage() {
        return I18N.getMessages().formDiscardChanges(model.getFormTitle());
    }

    private void onContextMenuEvent(Event event) {
        QFormController.Events.FORM_MENU_ITEM.setData(event.getData());
        fireExternalEvent(QFormController.Events.FORM_MENU_ITEM, true);
    }
    
    private void onFormElementReportDesignEvent(Event event) {
        QFormController.Events.FORM_ELEMENT_REPORT_DESIGN_EVENT.setData(event.getData());
        fireExternalEvent(QFormController.Events.FORM_ELEMENT_REPORT_DESIGN_EVENT, true);
    }
    
    protected void fireExternalEvent(Event action, boolean selectForm) {
        if(selectForm &&
                !(view.isSelected() ||
                QFormController.Events.FORM_SELECTION_REQUESTED_EVENT.equals(action) ||
                QFormController.Events.FORM_STATE_CHANGED_EVENT.equals(action))) {//we do not want to send selection_request event if the event is already selection request, or form_state_changed
            QFormController.Events.FORM_SELECTION_REQUESTED_EVENT.setData(model.getIndex());
            eventSource.fireEvent(QFormController.Events.FORM_SELECTION_REQUESTED_EVENT);//select this form, and then send real event.
        }
        eventSource.fireEvent(action);
    }
    
    protected void fireFormStateChangedEvent(int newState) {
        FormStateChangedData data = new FormStateChangedData();
        data.newFormState = newState;
        QFormController.Events.FORM_STATE_CHANGED_EVENT.setData(data);
        fireExternalEvent(QFormController.Events.FORM_STATE_CHANGED_EVENT, true);
    }
    
    protected void fireDataRequest(FieldDataRequest request) {
        QFormController.Events.FORM_CONTROL_NEED_MORE_DATA_EVENT.setData(request);
        fireExternalEvent(QFormController.Events.FORM_CONTROL_NEED_MORE_DATA_EVENT, true);
    }
    
    public void performAction(Event commonButtonIndex) {
        try {
            currentState.actionPerformed(commonButtonIndex);
        } catch (IncorrectFormActionPerformed incorrectFormActionPerformed) {
            DialogHelper.showModalErrorDialog(incorrectFormActionPerformed);
        }
    }
    
    protected boolean turnToState(QFormState newState) {
        boolean wasTurned;
        if (!currentState.equals(newState)) {
            wasTurned = currentState.canFromExitState();
            if(wasTurned) {
                view.setStateIcon(newState.getState());
                previousState = currentState;
                currentState.exitFromState();
                currentState = newState;
                currentState.enterToState(previousState.getState());
                model.setFormState(currentState.getState());
            }
        } else {
            wasTurned = true;
        }
        return wasTurned;
    }
    
    public void formStateChanged() {
        if(model.getFormState() != currentState.getState()) {
            switch(model.getFormState()) {
                case FormState.EDIT_STATE : {
                    turnToState(editState);
                    break;
                }
                case FormState.NEW_STATE : {
                    turnToState(newState);
                    break;
                }
                case FormState.SEARCH_STATE : {
                    turnToState(searchState);
                    break;
                }
                case FormState.SELECTED_STATE : {
                    turnToState(selectedState);
                    break;
                }
                case FormState.REPORT_DESIGN_STATE : {
                    turnToState(reportDesignState);
                    break;
                }
            }
        }
        fireFormStateChangedEvent(model.getFormState());
    }
    
    protected void addUnitToChain(ChainUnit newUnit) {
        unitsList.add(newUnit);
    }
    
    protected void fireInternalEvent(int eventId) {
        for (int i = 0; i < unitsList.size(); i++) {
            ChainUnit unit = (ChainUnit) unitsList.get(i);
            try {
                if(unit.isAccepted(eventId)) {
                    unit.removingFromChain();
                    unitsList.remove(unit);
                    unit.handleEvent(eventId);
                    break;
                }
            } catch (IncorrectFormActionPerformed incorrectFormActionPerformed) {
                DialogHelper.showModalErrorDialog(incorrectFormActionPerformed);
            }
        }
    }
    
    public void formDataUpdateStateChanged(int dataUpdatedState) {
        switch (dataUpdatedState) {
            case QFormModel.UPDATE_SUCCESSFUL: {
                fireInternalEvent(ChainUnit.UPDATE_SUCCESSFUL);
                break;
            }
            case QFormModel.UPDATE_FAILED: {
                fireInternalEvent(ChainUnit.UPDATE_FAILED);
                break;
            }
        }
    }
    
    public void formLockForEditStateChanged(int lockForEditState) {
        switch (lockForEditState) {
            case QFormModel.LOCK_FOR_EDIT_SUCCESSFUL: {
                fireInternalEvent(ChainUnit.LOCK_FOR_EDIT_SUCCESSFUL);
                break;
            }
            case QFormModel.LOCK_FOR_EDIT_FAILED: {
                fireInternalEvent(ChainUnit.LOCK_FOR_EDIT_FAILED);
                break;
            }
        }
    }

    public void formSearchStateChanged(int searchState) {
        switch(searchState) {
            case QFormModel.SEARCH_SUCCESSFUL_SINGLE: {
                fireInternalEvent(ChainUnit.SEARCH_SUCCESSFUL_SINGLE);
                break;
            }
            /*case QFormModel.SEARCH_SUCCESSFUL_MULTIPLE : {
                fireInternalEvent(ChainUnit.SEARCH_SUCCESSFUL_MULTIPLE);
                break;
            }*/
            case QFormModel.SEARCH_FAILED : {
                fireInternalEvent(ChainUnit.SEARCH_FAILED);
                break;
            }
        }
    }
    
    public void formDeleteStateChanged(int deleteState) {
        switch(deleteState) {
            case QFormModel.DELETE_SUCCESSFUL: {
                fireInternalEvent(ChainUnit.DELETE_SUCCESSFUL);
                break;
            }
            case QFormModel.DELETE_FAILED: {
                fireInternalEvent(ChainUnit.DELETE_FAILED);
                break;
            }
        }
    }
    
    public void formNewStateChanged(int newState) {
        switch(newState) {
            case QFormModel.NEW_SUCCESSFUL: {
                fireInternalEvent(ChainUnit.NEW_SUCCESSFUL);
                break;
            }
            case QFormModel.NEW_FAILED: {
                fireInternalEvent(ChainUnit.NEW_FAILED);
                break;
            }
        }
    }

    public void needDataInModel() {
        uploadDataToModel();
    }

    private void uploadDataToModel() {
        ArrayList ids = model.elementsKeys();
        for (int i = 0, n = ids.size(); i < n; i++) {
            String key = (String) ids.get(i);
            FieldData currentModelElementData = model.getElementData(key);
            QFormElement formElement = view.getControl(key);
            if (formElement != null) {
                uploadDataToElementModel(formElement);
                FieldData newModelElementData;
                if (currentModelElementData == null) {
                    newModelElementData = view.getControl(key).getBaseModel().getBaseData();
                    newModelElementData.setFieldID(key);
                } else {
                    newModelElementData = currentModelElementData;
                }
                model.setDataForElement(newModelElementData);
            }
        }
    }
    
    private void uploadDataToElementModel(QFormElement formElement) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -