📄 qformviewimpl.java
字号:
/*
* 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.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.EventPreview;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FocusListenerAdapter;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasFocus;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.KeyboardListenerCollection;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.queplix.core.client.app.Application;
import com.queplix.core.client.app.vo.BaseFieldMeta;
import com.queplix.core.client.app.vo.ContextMenuMeta;
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.FormButtonMeta;
import com.queplix.core.client.app.vo.FormHtmlElementMeta;
import com.queplix.core.client.app.vo.FormLayoutMeta;
import com.queplix.core.client.app.vo.FormLinkMeta;
import com.queplix.core.client.app.vo.FormMeta;
import com.queplix.core.client.app.vo.MenuItemMeta;
import com.queplix.core.client.app.vo.chart.ChartMeta;
import com.queplix.core.client.app.vo.chart.ChartModel;
import com.queplix.core.client.common.StringUtil;
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.ButtonData;
import com.queplix.core.client.common.ui.CommonActionButtonSet;
import com.queplix.core.client.common.ui.DialogHelper;
import com.queplix.core.client.common.ui.Icon;
import com.queplix.core.client.common.ui.IconButton;
import com.queplix.core.client.common.ui.IconData;
import com.queplix.core.client.common.ui.MenuPopup;
import com.queplix.core.client.controls.DataCloneException;
import com.queplix.core.client.controls.DataRequirementsListener;
import com.queplix.core.client.controls.QButton;
import com.queplix.core.client.controls.QElementsCoupler;
import com.queplix.core.client.controls.QFormComponentsFactory;
import com.queplix.core.client.controls.QFormElement;
import com.queplix.core.client.controls.QFormElementModel;
import com.queplix.core.client.controls.QFormElementModelImpl;
import com.queplix.core.client.controls.QFormElementView;
import com.queplix.core.client.controls.QFormHtmlElement;
import com.queplix.core.client.controls.QFormLayoutElement;
import com.queplix.core.client.controls.chart.QChart;
import com.queplix.core.client.frames.mainframe.FormState;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Implementation of the view for the QueWeb QForm.
*
* @author Sergey Kozmin
* @since 21 Sep 2006
*/
class QFormViewImpl extends QFormView implements ClickListener, QFormDataListener, DataRequirementsListener {
private static final String WHOLE_FORM_STYLE = QForm.FORM_STYLE_NAME_PREFIX + "wholeForm";
public static final String SEARCH_BUTTON_CAPTION = "Search";
public static final String CLEAR_BUTTON_CLEAR_CAPTION = "Clear";
public static final String CLEAR_BUTTON_CANCEL_CAPTION = "Cancel";
public static final String NEW_BUTTON_CAPTION = "New";
public static final String CHANGE_BUTTON_CAPTION = "Change";
public static final String UPDATE_BUTTON_CAPTION = "Save";
public static final Character SEARCH_BUTTON_KEYCODE = new Character('c');
public static final Character CLEAR_BUTTON_CLEAR_KEYCODE = new Character('r');
public static final Character CLEAR_BUTTON_CANCEL_KEYCODE = new Character('l');
public static final Character NEW_BUTTON_KEYCODE = new Character('n');
public static final Character CHANGE_BUTTON_KEYCODE = new Character('g');
public static final Character UPDATE_BUTTON_KEYCODE = new Character('s');
private static final int DEFAULT_MODIFIER_KEY = KeyboardListener.MODIFIER_ALT;
private static final String FORM_KEYCODE_PREFIX = "Alt + ";
private static final IconData ICON_STATE_SEARCH = new IconData("form/state_search.gif", "Form is in Search state");
private static final IconData ICON_STATE_SELECTED = new IconData("form/state_selected.gif", "Form is in Selected state");
private static final IconData ICON_STATE_NEW = new IconData("form/state_new.gif", "Form is in New state");
private static final IconData ICON_STATE_EDIT = new IconData("form/state_edit.gif", "Form is in Edit state");
private static final IconData ICON_REPORT_DESIGN = new IconData("form/state_report_design.gif", "Form is in Report Design state");
private static final ButtonData MENU_BUTTON = new ButtonData(null, null, "form_actionButton", null, "form_actionButton_hi", true);
private static final ButtonData MINIMIZE_BUTTON_MIN_STATE = new ButtonData(null, "Minimize form", "form_minButton", null, "form_minButton_hi", true);
private static final ButtonData MINIMIZE_BUTTON_MAX_STATE = new ButtonData(null, "Maximize form", "form_maxButton", null, "form_maxButton_hi", true);
private QFormModelImpl model;
private HashMap controls = new HashMap();
private HashMap customButtons = new HashMap();
private HashMap keyCodes = new HashMap();
private HashSet presentButtons = new HashSet();
private int formLayout;
private int gridWidth;
private int gridHeight;
private int lastXPosition;
private int lastYPosition;
private String actualHeight;
private Grid mainPanel;
private FocusPanel container;
private boolean textAreaHasFocus;
private boolean menuPopupShowRequest = false;
//used for having access to protected method getBodyElement()
private class InternalFlexTable extends FlexTable {
protected Element getBodyElement() {
return super.getBodyElement();
}
}
private InternalFlexTable elementsGrid;
private DockPanel titleBar;
private DockPanel elementsPanel;
private VerticalPanel elementsAndSizeKeeper;
private SimplePanel sizeKeeper;
private boolean minimized;
private Label rightSide;
private Label leftSide;
private Label bottomSide;
private CommonActionButtonSet commonActionPanel;
private QButton searchButton;
private QButton changeOrUpdateButton;
private QButton clearButton;
private QButton newButton;
private EventPreview keyboardEventPreview;
private DataRequirementsListener dataRequirementsListener;
private MenuPopup contextMenu;
private Icon stateIcon;
private IconButton minimizeButton;
private IconButton menuButton;
private int labelsOrientation;
private FormLayoutMeta layoutMeta;
private final List buttonsMeta = new ArrayList();
private FormLinkMeta[] links;
private final Map htmlElements = new HashMap();
private final List chartModels = new ArrayList();
private boolean selected;
private boolean isAlreadyLoaded = false;
public QFormViewImpl(QFormModelImpl model) {
initParams(model);
doInit();
}
public QFormViewImpl(QFormModelImpl model, int formLayout, int width, int height) {
initParams(model);
this.formLayout = formLayout;
this.gridWidth = width;
this.gridHeight = height;
doInit();
}
private void initParams(QFormModelImpl model) {
this.model = model;
FormMeta formMeta = model.getFormMeta();
layoutMeta = formMeta.getLayoutMeta();
FormButtonMeta[] buttonsMeta = formMeta.getButtons();
for(int i = 0; i < buttonsMeta.length; i++) {
this.buttonsMeta.add(buttonsMeta[i]);
}
FormHtmlElementMeta[] htmlElements = formMeta.getHtmlElements();
for (int i = 0; i < htmlElements.length; i++) {
this.htmlElements.put(htmlElements[i].getId(), htmlElements[i].getHtml());
}
ChartModel[] chartsModels = formMeta.getCharts();
if (chartsModels != null) {
for(int i = 0; i < chartsModels.length; i++) {
this.chartModels.add(chartsModels[i]);
}
}
this.links = formMeta.getLinks();
this.labelsOrientation = formMeta.getLabelsOrientation();
}
private void doInit() {
model.addDataListener(this);
initializeWrappingUI();
createMenu();
subscribeEvents();
initKeyboardHandling();
initFormLayoutUI();
}
private void initializeWrappingUI() {
container = new FocusPanel();
mainPanel = new Grid(3, 3);
elementsGrid = new InternalFlexTable();
elementsGrid.setCellPadding(0);
elementsGrid.setCellSpacing(0);
titleBar = new DockPanel();
stateIcon = new Icon(ICON_STATE_SEARCH);
stateIcon.setStyleName("form_topIcon");
minimizeButton = new IconButton(MINIMIZE_BUTTON_MIN_STATE);
menuButton = new IconButton(MENU_BUTTON);
titleBar.add(stateIcon, DockPanel.WEST);
titleBar.add(captionLabel, DockPanel.WEST);
captionLabel.setStyleName("form_topSide");
captionLabel.setWordWrap(false);
titleBar.setCellWidth(captionLabel, "100%");
titleBar.add(menuButton, DockPanel.EAST);
titleBar.add(minimizeButton, DockPanel.EAST);
titleBar.setCellWidth(menuButton, "1px");
titleBar.setCellWidth(minimizeButton, "1px");
elementsPanel = new DockPanel();
commonActionPanel = new CommonActionButtonSet();
commonActionPanel.getEventSource().addEventListener(el);
sizeKeeper = new SimplePanel();
sizeKeeper.setStyleName("form_sizeKeeper");
sizeKeeper.setHeight("1px");
elementsPanel.add(elementsGrid, DockPanel.CENTER);
elementsPanel.add(commonActionPanel, DockPanel.EAST);
elementsAndSizeKeeper = new VerticalPanel();
elementsAndSizeKeeper.add(elementsPanel);
elementsAndSizeKeeper.add(sizeKeeper);
Label leftTop = new Label(" ");
leftTop.setStyleName("form_leftTop");
leftSide = new Label(" ");
leftSide.setStyleName("form_leftSide");
Label leftBottom = new Label(" ");
leftBottom.setStyleName("form_leftBottom");
Label topSide = new Label(" ");
topSide.setStyleName("form_topSide");
bottomSide = new Label(" ");
bottomSide.setStyleName("form_bottomSide");
Label rightTop = new Label(" ");
rightTop.setStyleName("form_rightTop");
rightSide = new Label(" ");
rightSide.setStyleName("form_rightSide");
Label rightBottom = new Label(" ");
rightBottom.setStyleName("form_rightBottom");
mainPanel.setWidget(0, 0, leftTop);
mainPanel.setWidget(0, 1, titleBar);
mainPanel.setWidget(0, 2, rightTop);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -