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

📄 headergrid.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.common.ui.grid;

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.Event;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.queplix.core.client.common.StringUtil;
import com.queplix.core.client.common.event.EventSource;

/**
 * Header of DataGrid
 * @author Vasily Mikhailitchenko
 * @since 19 Dec 2006
 */
class HeaderGrid extends Grid implements TableListener {
    /**
     * None of cells selected.
     */
    private static final int COLUMN_UNSELECTED = -1;

    private static final int RESIZEABLE_AREA_OFFSET = 4;

    /**
     * Needed this for mouse events tracing
     */
    private int[] columnOffsets;
    /**
     * Current grid header captions
     */
    private String[] captions;
    /**
     * Current columns' sort orders
     */
    private Boolean[] sortOrders;
    /**
     * Is column resizing at the moment.
     */
    private boolean columnResizing;
    /**
     * Is cursor has resizing style (grid can turn to resizable state if user clicks mouse button).
     */
    private boolean cursorResizing;
    /**
     * Column to be resized
     */
    private int columnToResize;
    private int originalResizePosition;

    private Boolean initialSortOrder = null;
    private Boolean currentSortOrder;
    private int lastCellClicked = -1;

    private int lastColumnSelected = COLUMN_UNSELECTED;

    private boolean isColumnsFake = false;

    private GridModel model;
    private GridView view;

    private BaseInternalDataGrid dataGrid;
    private DataGrid parent;
    private GridElementsStrategy strategy;
    private GridSortListenerCollection sortListeners;

    public HeaderGrid(GridModel model,
                      GridView view,
                      DataGrid parent,
                      GridElementsStrategy strategy,
                      GridSortListenerCollection sortListeners) {

        // initialization
        this.model = model;
        this.view = view;
        this.parent = parent;
        this.strategy = strategy;
        this.sortListeners = sortListeners;

        resizeRows(1);
        sinkEvents(Event.MOUSEEVENTS);
        sinkEvents(Event.ONDBLCLICK);

        currentSortOrder = initialSortOrder;
        strategy.addTableListener(this);
        addTableListener(this);
    }

    public void setInternalDataGrid(BaseInternalDataGrid dataGrid){
        this.dataGrid = dataGrid;
    }

    public void resizeColumns(int columns) {
        if (columnOffsets == null || columnOffsets.length != columns) {
            columnOffsets = new int[columns];
            captions = new String[columns];
            sortOrders = new Boolean[columns];
        }
        super.resizeColumns(columns);
    }

    public void setupWidgets(final DataGridMeta dataGridMeta) {
        boolean performUpdate = false;
        if (dataGridMeta == null || dataGridMeta.getColumnsCount() < 1) {
            if(!isColumnsFake) {
                resizeColumns(1);
                setupFakeEmptyData();
                isColumnsFake = true;
                performUpdate = true;
            }
        } else {
            int columnsCount = dataGridMeta.getColumnsCount();
            if(getColumnCount() != columnsCount) {
                resizeColumns(columnsCount);
            }
            setupHeaders(dataGridMeta);
            isColumnsFake = false;
            performUpdate = true;
        }
        if(performUpdate) {
            removeColumnSelection();
            DeferredCommand.add(new Command() {
                public void execute() {
                    saveColumnsWidthAndOffsets();
    //                adaptGridSize();
                }
            });
        }
    }

    private void setupFakeEmptyData() {
        setCaption(0, "", null);
        getCellFormatter().setStyleName(0, 0, view.getHeaderCellStyleName());
        getRowFormatter().setStyleName(0, view.getHeaderRowStyleName());
    }

    private void setupHeaders(DataGridMeta dataGridMeta) {
        SortColumn sortColumn = model.getSortColumn();
        for (int column = 0; column < dataGridMeta.getColumnsCount(); column++) {
            Boolean sortBy = null;
            DataGridColumn dataGridColumn = dataGridMeta.getColumn(column);
            int startSize = dataGridColumn.getWidth();
            if(startSize == DataGridColumn.SIZE_UNSPECIFIED){
                startSize = DataGrid.calcHeaderColumnWidth(dataGridColumn.getCaption().length());
            }
            if(startSize < DataGridColumn.MINIMAL_WIDTH) {//initialize start site on attach event
                startSize = DataGridColumn.MINIMAL_WIDTH;
            }
            if(sortColumn != null) {
                if(column == sortColumn.getColumnIndex()) {
                    sortBy = sortColumn.getAscending();
                }
            }

            String newCaption = dataGridMeta.getCaption(column);
            if(!equalToCurrentCaption(newCaption, column, sortBy)) {
                setCaption(column, newCaption, sortBy);
                strategy.setHeaderColumnWidth(this, column, startSize, 0);
                getCellFormatter().setStyleName(0, column, view.getHeaderCellStyleName());
            }
            dataGrid.resizeColumn(column, startSize, 0);
        }
        getRowFormatter().addStyleName(0, view.getHeaderRowStyleName());
        saveColumnsWidthAndOffsets();
        setWidth(StringUtil.pixelToSize(dataGrid.getOffsetWidth()));
//        adaptGridSize();
    }

    private void setCaption(int column, String newCaption, Boolean sortBy) {
        captions[column] = newCaption;
        sortOrders[column] = sortBy;
        strategy.setHeaderCellValue(this, 0, column, newCaption, sortBy);
    }

    private boolean equalToCurrentCaption(String newCaption, int column, Boolean sortBy) {
        String oldCaption = captions[column];
        Boolean oldSortBy = sortOrders[column];
        
        if(oldSortBy == null){
            return (oldCaption != null) && oldCaption.equalsIgnoreCase(newCaption) && (sortBy == null);
        } else {
            return (oldCaption != null) && oldCaption.equalsIgnoreCase(newCaption) && oldSortBy.equals(sortBy);
        }
    }

    /*private void adaptGridSize() {
        String size = StringUtil.pixelToSize(columnOffsets[columnOffsets.length - 1]);
        DialogHelper.showMessageDialog("Size: " + size);
        setWidth(size);
        dataGrid.setWidth(size);
    }
*/
    public void saveColumnsWidthAndOffsets() {
        int offset = 0;
        for (int column = 0; column < columnOffsets.length; column++) {
            offset += getHeaderCellOffsetWidth(column);
            columnOffsets[column] = offset;
        }
        DataGridMeta dataGridMeta = model.getDataGridMeta();
        for (int i = 0, n = dataGridMeta.getColumnsCount(); i < n; i++){
            if(dataGridMeta.getColumn(i).isResized()){
                dataGridMeta.getColumn(i).setWidth(getHeaderCellWidth(i));
            }
        }
    }

    public int getHeaderCellWidth(int column) {
        Element tr = DOM.getChild(getBodyElement(), 0);
        Element td = DOM.getChild(tr, column);
        return DOM.getIntAttribute(td, "width");
    }

    private int getHeaderCellOffsetWidth(int column) {
        Element tr = DOM.getChild(getBodyElement(), 0);
        Element td = DOM.getChild(tr, column);
        return DOM.getIntAttribute(td, "offsetWidth");
    }

    public void onBrowserEvent(Event event) {
        int x = DOM.eventGetClientX(event) - DOM.getAbsoluteLeft(getElement());
        switch (DOM.eventGetType(event)) {

⌨️ 快捷键说明

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