package jdepend.client.ui.componentconf; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListModel; import jdepend.client.core.config.CommandConf; import jdepend.client.core.config.CommandConfMgr; import jdepend.client.core.config.GroupConf; import jdepend.client.ui.JDependCooper; import jdepend.framework.exception.JDependException; import jdepend.framework.util.BundleUtil; import jdepend.model.component.modelconf.ComponentConf; import jdepend.model.component.modelconf.ComponentModelConf; public final class ComponentModelMgrDialog extends JDialog { private GroupConf groupInfo; private DefaultListModel componentGroupListModel = new DefaultListModel(); private DefaultListModel componentListModel = new DefaultListModel(); // 组件关联的包 private DefaultListModel packageListModel = new DefaultListModel(); private String currentComponentModelName; private String currentComponent; private JDependCooper frame; public ComponentModelMgrDialog(JDependCooper parent, String currentGroup) { super(parent); this.frame = parent; this.setTitle("管理组件模型"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { refreshGroup(); } }); try { groupInfo = CommandConfMgr.getInstance().getTheGroup(currentGroup); } catch (JDependException e) { e.printStackTrace(); } this.setLayout(new BorderLayout()); setSize(ComponentModelPanel.Width, ComponentModelPanel.Height); this.setLocationRelativeTo(null);// 窗口在屏幕中间显示 this.add(BorderLayout.CENTER, this.getDefaultContent()); } private void refreshGroup() { try { frame.getGroupPanel().refreshGroup(); } catch (JDependException e1) { e1.printStackTrace(); } } private void refreshContent(JPanel content) { this.setVisible(false); getContentPane().removeAll(); getContentPane().add(BorderLayout.CENTER, content); this.setVisible(true); } private JPanel getDefaultContent() { JPanel framework = new JPanel(new BorderLayout()); JPanel content = new JPanel(new GridLayout(1, 3)); JPanel componentGroup = new JPanel(new BorderLayout()); componentGroup.add(BorderLayout.NORTH, new JLabel(BundleUtil.getString(BundleUtil.ClientWin_ComponentModel_Name) + ":")); componentGroup.add(BorderLayout.CENTER, this.createComponentGroupList()); content.add(componentGroup); JPanel componentList = new JPanel(new BorderLayout()); componentList.add(BorderLayout.NORTH, new JLabel(BundleUtil.getString(BundleUtil.ClientWin_ComponentModel_ComponentList) + ":")); componentList.add(BorderLayout.CENTER, this.createComponentList()); content.add(componentList); JPanel packageList = new JPanel(new BorderLayout()); packageList.add(BorderLayout.NORTH, new JLabel(BundleUtil.getString(BundleUtil.ClientWin_ComponentModel_ElementList) + ":")); packageList.add(BorderLayout.CENTER, this.createPackageList()); content.add(packageList); JPanel buttonBar = new JPanel(new FlowLayout()); buttonBar.add(createCloseButton()); framework.add(BorderLayout.CENTER, content); framework.add(BorderLayout.SOUTH, buttonBar); refreshComponentGroupList(); return framework; } private Component createPackageList() { JList packageList = new JList(packageListModel); return new JScrollPane(packageList); } private Component createComponentGroupList() { final JList componentGroupList = new JList(componentGroupListModel); final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem addItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Add)); addItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (groupInfo.getPath() != null) { refreshContent(getComponentGroupAddingPanel()); } else { JOptionPane.showMessageDialog(frame, "该命令组还没有配置分析资源的路径!"); } } }); popupMenu.add(addItem); JMenuItem updateItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Update)); updateItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List<String> names = componentGroupList.getSelectedValuesList(); if (names == null || names.size() == 0) { JOptionPane.showMessageDialog(frame, "请选择修改的组件模型!"); return; } else if (names.size() > 1) { JOptionPane.showMessageDialog(frame, "请选择一个修改的组件模型!"); return; } else { refreshContent(getComponentGroupUpdatePanel(names.get(0))); } } }); popupMenu.add(updateItem); JMenuItem deleteItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Delete)); deleteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List<String> names = componentGroupList.getSelectedValuesList(); if (names == null || names.size() == 0) { JOptionPane.showMessageDialog(frame, "请选择删除的组件模型!"); return; } else if (JOptionPane.showConfirmDialog(frame, "您是否确认删除?", "提示", JOptionPane.YES_NO_OPTION) == 0) { try { for (String name : names) { groupInfo.deleteComponentModel(name); CommandConf info = groupInfo.getCommandInfoByComponentGroup(name); if (info != null) { groupInfo.deleteCommand(info.label); } } refreshComponentGroupList(); } catch (JDependException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog(frame, e1.getMessage(), "error", JOptionPane.ERROR_MESSAGE); } } } }); popupMenu.add(deleteItem); JMenuItem copyItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Copy)); copyItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List<String> names = componentGroupList.getSelectedValuesList(); if (names == null || names.size() == 0) { JOptionPane.showMessageDialog(frame, "请选择拷贝的组件模型!"); return; } else if (names.size() > 1) { JOptionPane.showMessageDialog(frame, "请选择一个拷贝的组件模型!"); return; } else { CreateComponentModelFromCopyDialog d = new CreateComponentModelFromCopyDialog(names.get(0)); d.setModal(true); d.setVisible(true); } } }); popupMenu.add(copyItem); popupMenu.addSeparator(); JMenuItem creatCommandItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_CreateCommand)); creatCommandItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List<String> names = componentGroupList.getSelectedValuesList(); if (names == null || names.size() == 0) { JOptionPane.showMessageDialog(frame, "请选择组件组!"); return; } else if (names.size() > 1) { JOptionPane.showMessageDialog(frame, "请选择一个组件组!"); return; } else { try { // 根据新建的组件组信息创建命令 CommandConf info = CommandConf.create(names.get(0), groupInfo.getName()); groupInfo.insertCommand(info); JOptionPane.showMessageDialog(frame, "创建成功!"); } catch (JDependException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog(frame, e1.getMessage()); } } } }); popupMenu.add(creatCommandItem); componentGroupList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { JList theList = (JList) e.getSource(); ListModel model = theList.getModel(); int index = theList.locationToIndex(e.getPoint()); if (index >= 0) { currentComponentModelName = (String) model.getElementAt(index); theList.setSelectedIndex(index); refreshComponentList(); } if (e.getButton() == 3) popupMenu.show(theList, e.getX(), e.getY()); } }); return new JScrollPane(componentGroupList); } private Component createCloseButton() { JButton button = new JButton(BundleUtil.getString(BundleUtil.Command_Close)); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { refreshGroup(); dispose(); } }); return button; } private JPanel getComponentGroupAddingPanel() { JPanel addingPanel = new JPanel(); addingPanel.setLayout(new BorderLayout()); ComponentModelPanel componentPanel = new ComponentModelPanel(frame, this.groupInfo.getPath(), this.groupInfo.getName()); JPanel buttonBar = new JPanel(new FlowLayout()); buttonBar.add(createOKButton(componentPanel, "Add")); buttonBar.add(createCancelButton()); addingPanel.add(BorderLayout.CENTER, componentPanel); addingPanel.add(BorderLayout.SOUTH, buttonBar); return addingPanel; } private JPanel getComponentGroupUpdatePanel(String componentModelName) { JPanel addingPanel = new JPanel(); addingPanel.setLayout(new BorderLayout()); ComponentModelPanel componentPanel = new ComponentModelPanel(frame, this.groupInfo.getPath(), this.groupInfo.getName(), componentModelName); JPanel buttonBar = new JPanel(new FlowLayout()); buttonBar.add(createOKButton(componentPanel, "Update")); buttonBar.add(createCancelButton()); addingPanel.add(BorderLayout.CENTER, componentPanel); addingPanel.add(BorderLayout.SOUTH, buttonBar); return addingPanel; } private Component createOKButton(final ComponentModelPanel componentPanel, final String operation) { JButton button = new JButton(BundleUtil.getString(BundleUtil.Command_OK)); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { if (operation.equals("Add")) { create(componentPanel); } else { update(componentPanel); } refreshContent(getDefaultContent()); } catch (Exception ex) { ex.printStackTrace(); if (ex.getMessage() != null) { Component source = (Component) e.getSource(); JOptionPane.showMessageDialog(source, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } } }); return button; } private void create(ComponentModelPanel componentPanel) throws JDependException { componentPanel.validateData(); ComponentModelConf componentModel = componentPanel.getComponentModelConf(); if (groupInfo.getComponentModelConfNames().contains(componentModel.getName())) { throw new JDependException("组件组名称已经存在!"); } // 保存组件组信息 groupInfo.addComponentModel(componentModel); // 根据新建的组件组信息创建命令 CommandConf info = CommandConf.create(componentModel.getName(), groupInfo.getName()); groupInfo.insertCommand(info); } private void update(ComponentModelPanel componentPanel) throws JDependException { componentPanel.validateData(); // 保存组件组信息 this.groupInfo.insertComponentGroups(); } private Component createCancelButton() { JButton button = new JButton(BundleUtil.getString(BundleUtil.Command_Cancel)); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { refreshContent(getDefaultContent()); } }); return button; } private Component createComponentList() { final JList componentList = new JList(componentListModel); final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem detailItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ViewDetail)); detailItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { detailComponentConf(currentComponent); } }); popupMenu.add(detailItem); JMenuItem deleteItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Delete)); deleteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (JOptionPane.showConfirmDialog(frame, "您是否确认删除?", "提示", JOptionPane.YES_NO_OPTION) == 0) { try { deleteComponentConf(currentComponent); refreshComponentGroupList(); } catch (JDependException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog((Component) e.getSource(), e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } } }); popupMenu.add(deleteItem); componentList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { JList theList = (JList) e.getSource(); ListModel model = theList.getModel(); int index = theList.locationToIndex(e.getPoint()); if (index >= 0) { currentComponent = (String) model.getElementAt(index); theList.setSelectedIndex(index); refreshPackageList(); } if (e.getButton() == 3) popupMenu.show(theList, e.getX(), e.getY()); } }); return new JScrollPane(componentList); } private void deleteComponentConf(String currentComponent) throws JDependException { this.groupInfo.getTheComponentModelConf(this.currentComponentModelName).deleteComponentConf(currentComponent); this.groupInfo.insertComponentGroups(); } private void detailComponentConf(String currentComponent) { ComponentConf componentConf = this.groupInfo.getTheComponentModelConf(this.currentComponentModelName) .getTheComponentConf(currentComponent); UpdateComponentConfDialog d = new UpdateComponentConfDialog(this.groupInfo.getName(), this.currentComponentModelName, componentConf); d.setModal(true); d.setVisible(true); } private void refreshComponentGroupList() { componentGroupListModel.removeAllElements(); Collection<String> componentGroupNames = new ArrayList<String>(); componentGroupNames = this.groupInfo.getComponentModelConfNames(); for (String componentGroupName : componentGroupNames) { componentGroupListModel.addElement(componentGroupName); } if (componentGroupListModel.size() > 0) { currentComponentModelName = (String) componentGroupListModel.get(0); refreshComponentList(); } } private void refreshComponentList() { componentListModel.removeAllElements(); ComponentModelConf componentGroup = this.groupInfo.getTheComponentModelConf(currentComponentModelName); for (String componentName : componentGroup.getComponentConfNames()) { componentListModel.addElement(componentName); } if (componentListModel.size() > 0) { currentComponent = (String) componentListModel.get(0); refreshPackageList(); } } private void refreshPackageList() { packageListModel.removeAllElements(); ComponentModelConf componentGroup = this.groupInfo.getTheComponentModelConf(currentComponentModelName); for (String packageName : componentGroup.getTheComponentConf(currentComponent).getItemIds()) { packageListModel.addElement(packageName); } } class CreateComponentModelFromCopyDialog extends JDialog { private String source; private JTextField componentModelName; public CreateComponentModelFromCopyDialog(String source) { this.source = source; this.setLayout(new BorderLayout()); setSize(250, 120); this.setLocationRelativeTo(null);// 窗口在屏幕中间显示 JPanel content = new JPanel(new BorderLayout()); JLabel componentModelLabel = new JLabel("组件模型名:"); content.add(BorderLayout.WEST, componentModelLabel); componentModelName = new JTextField(); content.add(BorderLayout.CENTER, componentModelName); JPanel buttonBar = new JPanel(new FlowLayout()); buttonBar.add(createOkButton()); buttonBar.add(createCancelButton()); this.add(BorderLayout.CENTER, content); this.add(BorderLayout.SOUTH, buttonBar); } protected Component createOkButton() { JButton button = new JButton(BundleUtil.getString(BundleUtil.Command_OK)); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (componentModelName.getText() == null || componentModelName.getText().length() == 0) { JOptionPane.showMessageDialog((Component) e.getSource(), "请录入组件模型名称", "alert", JOptionPane.ERROR_MESSAGE); return; } String modelName = componentModelName.getText(); if (groupInfo.getComponentModelConfNames().contains(modelName)) { JOptionPane.showMessageDialog((Component) e.getSource(), "组件模型名称重复,请从新录入", "alert", JOptionPane.ERROR_MESSAGE); return; } try { ComponentModelConf sourceModel = groupInfo.getTheComponentModelConf(source); ComponentModelConf newModel = sourceModel.clone(); newModel.setName(modelName); groupInfo.addComponentModel(newModel); groupInfo.getGroupComponentModelConf().save(); refreshComponentGroupList(); CreateComponentModelFromCopyDialog.this.dispose(); } catch (JDependException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog((Component) e.getSource(), e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } catch (CloneNotSupportedException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog((Component) e.getSource(), e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } }); return button; } private Component createCancelButton() { JButton button = new JButton(BundleUtil.getString(BundleUtil.Command_Cancel)); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { CreateComponentModelFromCopyDialog.this.dispose(); } }); return button; } } }