一年精通帆软报表之设计器的左边部分文件列表以及数据集的源码分析

楼主
插件开发者

 1 WestRegionContainerPane包含的就是上边两部分。上面文件列表是com.fr.design.mainframe.DesignerFrameFileDealerPane,下面数据集是com.fr.design.data.datapane.TableDataTreePane.

2 WestRegionContainerPane继承了UIResizableContainer,说明该区域大小可改变。

3 UIResizableContainer里面的组件构成:

        

    private JComponent upPane;
    private JComponent downPane;
    private JComponent parameterPane;
    private UIResizableContainer.HorizotalToolPane horizontToolPane;
    private UIResizableContainer.VerticalToolPane verticalToolPane;

  可以看出有三个组件:upPane,downPane,parameterPane,两个工具组件:horizontToolPane,verticalToolPane.

4 DesignerFrameFileDealerPane就放在了 upPane上,TableDataTreePane就放在了downPane上。parameterPane在这没有实例化。

5 DesignerFrameFileDealerPane:

        

private DesignerFrameFileDealerPane() {
        this.setLayout(new BorderLayout());
        this.toolBar = ToolBarDef.createJToolBar();
        this.toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR));
        this.toolBar.setBorderPainted(true);
        JPanel tooBarPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
        JPanel parent = new JPanel(new BorderLayout());
        parent.add(this.toolBar, "Center");
        parent.setBorder(BorderFactory.createEmptyBorder(3, 0, 4, 0));
        tooBarPane.add(parent, "Center");
        tooBarPane.add(new UIMenuHighLight(), "South");
        this.add(tooBarPane, "North");
        CardLayout card;
        JPanel cardPane = new JPanel(card = new CardLayout());
        cardPane.add(TemplateTreePane.getInstance(), "file");
        this.selectedOperation = TemplateTreePane.getInstance();
        card.show(cardPane, "file");
        TemplateTreePane.getInstance().setToolbarStateChangeListener(this);
        this.add(cardPane, "Center");
        this.stateChange();
    }

        5.1 使用BorderLayout布局,

        5.2 Center放的是cardPane,North放的是tooBarPane

        5.3 tooBarPane也使用的是BorderLayout布局,它的Center放的是parent的JPanel,South放的是UIMenuHighLight

        5.4 cardPane使用CardLayout布局,他加入了TemplateTreePane作为子组件,这个组件应该是文件树组件。

        5.5 parent的JPanel使用的也是BorderLayout,它的Center放的是toolBar。

        5.6 toolBar上的那一排按钮是怎么加上去的。,他们是在方法refreshDockingView上加的。

        

public void refreshDockingView() {
        ToolBarDef toolbarDef = new ToolBarDef();
        toolbarDef.addShortCut(new ShortCut[]{this.newFolderAction, this.refreshTreeAction});
        if (WorkContext.getCurrent().isLocal()) {
            toolbarDef.addShortCut(new ShortCut[]{this.showInExplorerAction});
        }

        toolbarDef.addShortCut(new ShortCut[]{this.renameAction, this.delFileAction});
        Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts();
        Iterator var3 = extraShortCuts.iterator();

        while(var3.hasNext()) {
            ShortCut shortCut = (ShortCut)var3.next();
            toolbarDef.addShortCut(new ShortCut[]{shortCut});
        }

        this.addVcsAction(toolbarDef);
        toolbarDef.updateToolBar(this.toolBar);
        this.resetActionStatus();
        this.refresh();
    }

       可以看出

addShortCut方法就是增加一个按钮,一共增加了newFolderAction,refreshTreeAction,showInExplorerAction,renameAction,delFileAction。这里还有一个插件扩展点Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts();我们可以自己来添加自己的功能按钮到toolBar上。

6 TableDataTreePane:

        

private TableDataTreePane() {
        this.setLayout(new BorderLayout(4, 0));
        this.setBorder((Border)null);
        this.dataTree = new TableDataTree();
        ToolTipManager.sharedInstance().registerComponent(this.dataTree);
        ToolTipManager.sharedInstance().setDismissDelay(3000);
        ToolTipManager.sharedInstance().setInitialDelay(0);
        this.addMenuDef = new MenuDef(Toolkit.i18nText("Fine-Design_Basic_Action_Add"));
        this.addMenuDef.setIconPath("/com/fr/design/images/control/addPopup.png");
        this.createAddMenuDef();
        this.createPluginListener();
        this.editAction = new TableDataTreePane.EditAction();
        this.removeAction = new TableDataTreePane.RemoveAction();
        this.previewTableDataAction = new PreviewTableDataAction(this, this.dataTree);
        this.connectionTableAction = new ConnectionTableAction(this);
        this.toolbarDef = new ToolBarDef();
        this.toolbarDef.addShortCut(new ShortCut[]{this.addMenuDef, SeparatorDef.DEFAULT, this.editAction, this.removeAction, SeparatorDef.DEFAULT, this.previewTableDataAction, this.connectionTableAction});
        UIToolbar toolBar = ToolBarDef.createJToolBar();
        toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR));
        toolBar.setBorderPainted(true);
        this.toolbarDef.updateToolBar(toolBar);
        JPanel toolbarPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
        toolbarPane.add(toolBar, "Center");
        this.add(toolbarPane, "North");
        UIScrollPane scrollPane = new UIScrollPane(this.dataTree);
        scrollPane.setBorder((Border)null);
        this.initbuttonGroup();
        JPanel jPanel = new JPanel(new BorderLayout(0, 0));
        JPanel buttonPane = new JPanel(new GridLayout());
        buttonPane.add(this.buttonGroup, "Center");
        jPanel.add(buttonPane, "North");
        jPanel.add(scrollPane, "Center");
        this.add(jPanel, "Center");
        this.dataTree.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                TableDataTreePane.this.checkButtonEnabled();
            }
        });
        this.dataTree.addKeyListener(this.getTableTreeNodeListener(this.editAction, this.previewTableDataAction, this.removeAction, this.op, this.dataTree));
        this.dataTree.setEditable(true);
        TableDataTreeCellEditor treeCellEditor = new TableDataTreeCellEditor(this, new UITextField(), this.dataTree, this);
        treeCellEditor.addCellEditorListener(treeCellEditor);
        this.dataTree.setCellEditor(treeCellEditor);
        new TableDataTreeDragSource(this.dataTree, 1);
        this.checkButtonEnabled();
    }

        6.1 也是BorderLayout布局,North放的是toolbarPane,Center放的是一个jPanel的Panel。

        6.2 toolbarPane里放的是toolBar,toolBar上增加了addMenuDef下拉菜单,分割线,

editAction,removeAction,分割线,previewTableDataAction,connectionTableAction

        6.3 jPanel里放到是buttonPane,scrollPane。scrollPanel放的是dataTree,dataTree应该就是我们定义的数据集树。

        6.4 新增各种数据集的菜单在哪定义的呢?在createPluginListener中定义的     

private void createPluginListener() {
        GeneralContext.listenPluginRunningChanged(new PluginEventListener(1) {
            public void on(PluginEvent event) {
                TableDataTreePane.this.addMenuDef.clearShortCuts();
                TableDataTreePane.this.createAddMenuDef();
            }
        }, new PluginFilter() {
            public boolean accept(PluginContext context) {
                return context.contain(PluginModule.ExtraDesign);
            }
        });
    }

        在TableDataTreePane.this.createAddMenuDef()中定义的。

        

 protected void createAddMenuDef() {
        TableDataNameObjectCreator[] creators = TableDataCreatorProducer.getInstance().createReportTableDataCreator();
        TableDataNameObjectCreator[] var2 = creators;
        int var3 = creators.length;

        for(int var4 = 0; var4 < var3; ++var4) {
            final TableDataNameObjectCreator creator = var2[var4];
            if (creator.shouldInsertSeparator()) {
                this.addMenuDef.addShortCut(new LineSeparator());
            }

            this.addMenuDef.addShortCut(new BasicTableDataTreePane.TDAction() {
                protected String getTDName() {
                    return creator.menuName();
                }

                protected Icon getTDIcon() {
                    return creator.menuIcon();
                }

                protected String getNamePrefix() {
                    return creator.getPrefix();
                }

                protected TemplateTableDataWrapper getTableDataInstance() {
                    return new TemplateTableDataWrapper((TableData)creator.createObject());
                }
            });
        }

    }
重点是TableDataNameObjectCreator[] creators = TableDataCreatorProducer.getInstance().createReportTableDataCreator();
public TableDataNameObjectCreator[] createReportTableDataCreator() {
        TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_DS_Database_Query"), "ds", "/com/fr/design/images/data/database.png", DBTableData.class, DBTableDataPane.class);
        TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"), "Class", "/com/fr/design/images/data/source/classTableData.png", ClassTableData.class, ClassTableDataPane.class);
        TableDataNameObjectCreator table = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"), "Embedded", "/com/fr/design/images/data/dataTable.png", EmbeddedTableData.class, EmbeddedTableDataPane.class);
        TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Relation"), "Multi", "/com/fr/design/images/data/multi.png", ConditionTableData.class, MultiTDTableDataPane.class) {
            public boolean isNeedParameterWhenPopulateJControlPane() {
                return true;
            }
        };
        TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_File"), "File", "/com/fr/design/images/data/file.png", FileTableData.class, FileTableDataSmallHeightPane.class);
        TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Tree"), "Tree", "/com/fr/design/images/data/tree.png", RecursionTableData.class, TreeTableDataPane.class) {
            public boolean isNeedParameterWhenPopulateJControlPane() {
                return true;
            }
        };
        TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(Toolkit.i18nText("Fine-Design_Basic_Datasource_Stored_Procedure"), "Proc", "/com/fr/design/images/data/store_procedure.png", StoreProcedure.class, ProcedureDataPane.class) {
            public boolean shouldInsertSeparator() {
                return true;
            }
        };
        TableDataNameObjectCreator[] creators = new TableDataNameObjectCreator[]{dataBase, ds_Class, table, fileTable, storeProcedure, multiTable, treeTable};
        return this.merge(creators, ExtraDesignClassManager.getInstance().getReportTableDataCreators());
    }

这里面定义了集中数据集,还有一个插件扩展点ExtraDesignClassManager.getInstance().getReportTableDataCreators(),扩展名TableDataDefineProvider。

更多内容:https://blog.csdn.net/sixingbugai?spm=1000.2115.3001.5343

分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表