java类org.eclipse.jface.viewers.CheckStateChangedEvent的实例源码

CommitDialog.java 文件源码 项目:pgcodekeeper 阅读 27 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
    boolean showWarning = false;
    for (TreeElement el : depcyElementsSet) {
        if (!el.isSelected()) {
            switch (el.getSide()) {
            // удаляется
            case LEFT:
                showWarning = hasSelectedParent(el);
                break;
                // создается
            case RIGHT:
                showWarning = el.isSubTreeSelected();
                break;
            default:
                break;
            }
            if (showWarning) {
                break;
            }
        }
    }
    warningLbl.setVisible(showWarning);
    getButton(OK).setEnabled(!showWarning);
}
ImportFromDatabaseWizardPage.java 文件源码 项目:bdf2 阅读 29 收藏 0 点赞 0 评论 0
private void checkboxTreeViewerCheckStateChanged(CheckStateChangedEvent event) {
    CheckboxTreeViewer viewer = (CheckboxTreeViewer) event.getSource();
    TableTreeNode node = (TableTreeNode) event.getElement();
    if (event.getChecked()) {
        viewer.setSubtreeChecked(node, true);
    } else {
        viewer.setSubtreeChecked(node, false);
        if (node.getParent() != null) {
            viewer.setChecked(node.getParent(), false);
        }
    }
    Object[] elements = viewer.getCheckedElements();
    setPageComplete(elements.length > 0 ? true : false);

    checkedTables.clear();
    TableTreeNode tableTreeNode;
    for (Object obj : elements) {
        tableTreeNode = (TableTreeNode) obj;
        if (tableTreeNode.isTable) {
            checkedTables.add(tableTreeNode.getName());
        } else {
            dbDriverMetaData.setDbSchema(tableTreeNode.getName());
        }
    }
}
GitImportWizardSelectProjectsPage.java 文件源码 项目:team-explorer-everywhere 阅读 23 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(final CheckStateChangedEvent event) {
    try {
        final Object eventElement = event.getElement();

        if (eventElement instanceof ImportEclipseProject) {
            final ImportEclipseProject project = (ImportEclipseProject) eventElement;
            if (!canImport(project)) {
                treeViewer.setChecked(project, false);
            }

            project.setSelected(treeViewer.getChecked(project));
            treeViewer.refresh(project);
        }
    } catch (final Exception e) {
        logger.error(e.getMessage(), e);
    } finally {
        handleProjectSelection();
    }
}
CheckboxTreeAndListGroup.java 文件源码 项目:eclipse-code-lines-plugin 阅读 30 收藏 0 点赞 0 评论 0
public void checkStateChanged(final CheckStateChangedEvent event)
    {
        BusyIndicator.showWhile(fTreeViewer.getControl().getDisplay(), new Runnable() {

            public void run()
            {
                if(event.getCheckable().equals(fTreeViewer))
                    treeItemChecked(event.getElement(), event.getChecked());
                else
                    listItemChecked(event.getElement(), event.getChecked(), true);
                notifyCheckStateChangeListeners(event);
            }

        }
);
    }
SimulationWizard.java 文件源码 项目:CARMA 阅读 27 收藏 0 点赞 0 评论 0
public void createViewer(Composite parent){

    GridData gridData = new GridData(GridData.FILL_BOTH);
    gridData.horizontalSpan = 2;

    viewer = CheckboxTableViewer.newCheckList(parent, SWT.NONE);
    viewer.getTable().setLayoutData(gridData);
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setLabelProvider(getProvider());
    viewer.setInput(getViewerInput());
    viewer.addCheckStateListener(new ICheckStateListener() {

        public void checkStateChanged(CheckStateChangedEvent event) {
            checkPage();
        }

    });
    checkPage();
    parent.pack();
}
TreeExpandingDoubleClickListener.java 文件源码 项目:statecharts 阅读 22 收藏 0 点赞 0 评论 0
public void doubleClick(DoubleClickEvent event) {
    IStructuredSelection selection = (IStructuredSelection) event
            .getSelection();
    Object firstElement = selection.getFirstElement();
    if (treeViewer.isExpandable(firstElement)) {
        boolean expanded = treeViewer.getExpandedState(firstElement);
        treeViewer.setExpandedState(firstElement, !expanded);
    } else {
        // FIXME :: does not trigger validation
        boolean newState = !treeViewer.getChecked(firstElement);
        treeViewer.setChecked(firstElement, newState);
        if (checkStateListener != null) {
            checkStateListener
                    .checkStateChanged(new CheckStateChangedEvent(
                            treeViewer, firstElement, newState));
        }
    }
}
ProblemsTreeEditor.java 文件源码 项目:cppcheclipse 阅读 23 收藏 0 点赞 0 评论 0
public void checkStateChanged(CheckStateChangedEvent event) {
    Object element = event.getElement();
    // in case of changed category, go to all problems
    if (element instanceof String) {
        ITreeContentProvider contentProvider = (ITreeContentProvider)getTreeViewer().getContentProvider();
        Object[] problems = contentProvider.getChildren(element);
        for (Object problem : problems) {
            if (problem instanceof Problem) {
                ((Problem)problem).setEnabled(event.getChecked());
            }
        }
    }

    if (element instanceof Problem) {
        ((Problem) element).setEnabled(event.getChecked());
    }

}
FJExportWizardFilesSelectPage.java 文件源码 项目:agui_eclipse_plugin 阅读 25 收藏 0 点赞 0 评论 0
private void dialogCheckChanged(CheckStateChangedEvent event) {

        FJTree element = (FJTree) event.getElement();
        if (element != null) {
            boolean checked = event.getChecked();
            if (!checked && (element.getCheckState() == FJTree.CS_GRAYED)) {
                fileTree.setGrayed(element, false);
                fileTree.setChecked(element, true);
                checked = true;
            }
            if ((checked && (element.getCheckState() != FJTree.CS_CHECKED))
                    || (!checked && (element.getCheckState() != FJTree.CS_UNCHECKED))) {
                element.setChecked(checked);
                recursiveCheckChildren(element, checked);
                recursiveGrayParents(element);
            }
        }
        dialogChanged();
    }
FilesSelectPage.java 文件源码 项目:agui_eclipse_plugin 阅读 27 收藏 0 点赞 0 评论 0
private void dialogCheckChanged(CheckStateChangedEvent event) {

        FJTree element = (FJTree)event.getElement();
        if (element != null) {
            boolean checked = event.getChecked();
            if (!checked && (element.getCheckState() == FJTree.CS_GRAYED)) {
                fileTree.setGrayed(element, false);
                fileTree.setChecked(element, true);
                checked = true;
            }
            if (    ( checked && (element.getCheckState() != FJTree.CS_CHECKED)) ||
                    (!checked && (element.getCheckState() != FJTree.CS_UNCHECKED))){
                element.setChecked(checked);
                recursiveCheckChildren(element, checked);
                recursiveGrayParents(element);
            }
        }
        dialogChanged();
    }
CheckNodeTreeView.java 文件源码 项目:depan 阅读 22 收藏 0 点赞 0 评论 0
@Override
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
  int style = SWT.VIRTUAL | SWT.FULL_SELECTION | SWT.BORDER
      | SWT.H_SCROLL | SWT.V_SCROLL;
  CheckboxTreeViewer result = new CheckboxTreeViewer(parent, style);
  result.setLabelProvider(new WorkbenchLabelProvider());
  result.setContentProvider(new BaseWorkbenchContentProvider());
  result.setComparator(new NodeWrapperTreeSorter());

  result.addCheckStateListener(new ICheckStateListener() {
    @Override
    public void checkStateChanged(CheckStateChangedEvent event) {
      if (recursiveTreeSelect) {
        tree.setSubtreeChecked(event.getElement(), event.getChecked());
      }
    }
  });

  tree = result;
  return result;
}
MultipleFolderSelectionDialog.java 文件源码 项目:filesync4eclipse 阅读 31 收藏 0 点赞 0 评论 0
/**
 * Creates the tree viewer.
 *
 * @param parent the parent composite
 * @return the tree viewer
 */
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
    fViewer = new CheckboxTreeViewer(parent, SWT.BORDER);

    fViewer.setContentProvider(fContentProvider);
    fViewer.setLabelProvider(fLabelProvider);
    fViewer.addCheckStateListener(new ICheckStateListener() {
        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            updateOKStatus();
        }
    });

    fViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
    if (fFilters != null) {
        for (int i = 0; i != fFilters.size(); i++) {
            fViewer.addFilter((ViewerFilter) fFilters.get(i));
        }
    }

    fViewer.setInput(fInput);

    return fViewer;
}
ComponentsPage.java 文件源码 项目:p2-installer 阅读 103 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
    DetailTreeItem item = (DetailTreeItem)event.getElement();
    IInstallComponent component = (IInstallComponent)item.getData();
    if (component.isOptional()) {
        // Updated install state
        component.setInstall(item.isChecked());

        // Update install space for new component selection
        updateInstallPlan();
        // Update button state
        updateButtons();
        // Validate selection
        validateSelection(item);
    }
}
MultipleFolderSelectionDialog.java 文件源码 项目:Eclipse-Postfix-Code-Completion 阅读 30 收藏 0 点赞 0 评论 0
/**
 * Creates the tree viewer.
 *
 * @param parent the parent composite
 * @return the tree viewer
 */
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
    fViewer = new CheckboxTreeViewer(parent, SWT.BORDER);

    fViewer.setContentProvider(fContentProvider);
    fViewer.setLabelProvider(fLabelProvider);
    fViewer.addCheckStateListener(new ICheckStateListener() {
        public void checkStateChanged(CheckStateChangedEvent event) {
            updateOKStatus();
        }
    });

    fViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
    if (fFilters != null) {
        for (int i = 0; i != fFilters.size(); i++)
            fViewer.addFilter(fFilters.get(i));
    }

    fViewer.setInput(fInput);

    return fViewer;
}
WizardExportResourcesPage2.java 文件源码 项目:translationstudio8 阅读 27 收藏 0 点赞 0 评论 0
/**
 * Creates the checkbox tree and list for selecting resources.
 * @param parent
 *            the parent control
 */
protected final void createResourcesGroup(Composite parent) {

    // create the input element, which has the root resource
    // as its only child
    List input = new ArrayList();
    IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
    for (int i = 0; i < projects.length; i++) {
        if (projects[i].isOpen()) {
            input.add(projects[i]);
        }
    }

    this.resourceGroup = new ResourceTreeAndListGroup(parent, input, getResourceProvider(IResource.FOLDER
            | IResource.PROJECT), WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
            getResourceProvider(IResource.FILE), WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
            SWT.NONE, DialogUtil.inRegularFontMode(parent));

    ICheckStateListener listener = new ICheckStateListener() {
        public void checkStateChanged(CheckStateChangedEvent event) {
            updateWidgetEnablements();
        }
    };

    this.resourceGroup.addCheckStateListener(listener);
}
CheckedCamelDependenciesPanel.java 文件源码 项目:tesb-studio-se 阅读 27 收藏 0 点赞 0 评论 0
@Override
protected TableViewer createTableViewer() {
    final CheckboxTableViewer viewer = CheckboxTableViewer.newCheckList(this, SWT.MULTI | SWT.H_SCROLL
        | SWT.V_SCROLL | SWT.BORDER);
    viewer.setCheckStateProvider(checkStateProvider);
    viewer.addCheckStateListener(new ICheckStateListener() {
        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            if (((ManifestItem) event.getElement()).isBuiltIn()) {
                viewer.setChecked(event.getElement(), !event.getChecked()); 
            } else {
                ((ManifestItem) event.getElement()).setOptional(!event.getChecked());
                fireDependenciesChangedListener();
            }
        }
    });
    return viewer;
}
DescribeVersionsDialog.java 文件源码 项目:ChangeScribe 阅读 28 收藏 0 点赞 0 评论 0
@Override
protected Control createDialogArea(Composite parent) {
    Composite container = (Composite) super.createDialogArea(parent);
    parent.getShell().setText(Messages.FilesChangedListDialog_CommitChanges);

    container = createDialogAreaUtil(container);
    setTitle(Messages.FilesChangedListDialog_CommitChanges);
    setMessage(Messages.FilesChangedListDialog_CommitMessage, IMessageProvider.INFORMATION); //$NON-NLS-1$

    filesViewer.addCheckStateListener(new ICheckStateListener() {

        public void checkStateChanged(CheckStateChangedEvent event) {
            updateMessage();
        }
    });

    updateFileSectionText();
    return container;
}
DeploymentPlanCheckStateListener.java 文件源码 项目:idecore 阅读 21 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
    // check/uncheck element
    if (event.getElement() != null) {
        DeploymentComponent deploymentComponent = (DeploymentComponent) event.getElement();
        deploymentComponent.setDeploy(event.getChecked());

        DeploymentComponentSet components = page.getController().getDeploymentPayload().getDeploymentComponents();
        for (DeploymentComponent component : components) {
            if (component.getComponent().getName().equals(deploymentComponent.getComponent().getName())
                    && component.getComponent().isMetadataInstance()) {
                component.setDeploy(event.getChecked());
            }
        }
    }
    page.setEnableButton();
}
PackagesCheckStateListener.java 文件源码 项目:SPLevo 阅读 26 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent event) {        
    CheckboxTreeViewer packagesTreeViewer = (CheckboxTreeViewer) event.getSource();        
    packagesTreeViewer.setSubtreeChecked(event.getElement(), event.getChecked());                

    for (IPackageFragment parentPackage : getParentPackages(((IPackageFragment) event.getElement()))) {            
        int countOfCheckedSubpackages = getCountOfCheckedSubpackages(parentPackage, packagesTreeViewer);

        if (countOfCheckedSubpackages == getAllSubPackages(parentPackage).size()) {                
            packagesTreeViewer.setGrayed(parentPackage, false);
            packagesTreeViewer.setChecked(parentPackage, true);
        } else if (countOfCheckedSubpackages > 0) {
            packagesTreeViewer.setChecked(parentPackage, true);
            packagesTreeViewer.setGrayed(parentPackage, true);
        } else {
            packagesTreeViewer.setChecked(parentPackage, false);
            packagesTreeViewer.setGrayed(parentPackage, false);
        }
    }
}
MultipleFolderSelectionDialog.java 文件源码 项目:Eclipse-Postfix-Code-Completion-Juno38 阅读 27 收藏 0 点赞 0 评论 0
/**
 * Creates the tree viewer.
 *
 * @param parent the parent composite
 * @return the tree viewer
 */
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
    fViewer = new CheckboxTreeViewer(parent, SWT.BORDER);

    fViewer.setContentProvider(fContentProvider);
    fViewer.setLabelProvider(fLabelProvider);
    fViewer.addCheckStateListener(new ICheckStateListener() {
        public void checkStateChanged(CheckStateChangedEvent event) {
            updateOKStatus();
        }
    });

    fViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
    if (fFilters != null) {
        for (int i = 0; i != fFilters.size(); i++)
            fViewer.addFilter(fFilters.get(i));
    }

    fViewer.setInput(fInput);

    return fViewer;
}
ExternalImportInputWizard.java 文件源码 项目:Environment 阅读 27 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
    /*
    Object el = event.getElement();         
    EObject root = null;

    //get root object
    if (el instanceof EObject){
        root = (EObject)el;
    }
    if(el instanceof Resource){
        Resource r = (Resource)el;
        root = r.getContents().isEmpty() ? null : r.getContents().get(0);
    }

    if(root instanceof UsageModel){
        importModelSelectionPage.selectResource(ModelType.USAGE, false, false);
        importModelSelectionPage.selectResource(root.eResource(), event.getChecked());
    }
    */
}
PathsProvider.java 文件源码 项目:FindBug-for-Domino-Designer 阅读 33 收藏 0 点赞 0 评论 0
protected PathsProvider(TableViewer viewer, FindbugsPropertyPage propertyPage) {
        this.propertyPage = propertyPage;
        this.paths = new ArrayList<IPathElement>();
        this.viewer = viewer;
        if(viewer instanceof CheckboxTableViewer) {
            CheckboxTableViewer tv = (CheckboxTableViewer) viewer;
//            tv.setCheckStateProvider(this);
            tv.addCheckStateListener(new ICheckStateListener() {
                public void checkStateChanged(CheckStateChangedEvent event) {
                    boolean checked = event.getChecked();
                    IPathElement element = (IPathElement) event.getElement();
                    element.setEnabled(checked);
                    handleContendChanged();
                }
            });
        }
        this.control = viewer.getTable();
        listeners = new ListenerList();
        viewer.setContentProvider(this);
    }
WizardExportResourcesPage2.java 文件源码 项目:tmxeditor8 阅读 30 收藏 0 点赞 0 评论 0
/**
 * Creates the checkbox tree and list for selecting resources.
 * @param parent
 *            the parent control
 */
protected final void createResourcesGroup(Composite parent) {

    // create the input element, which has the root resource
    // as its only child
    List input = new ArrayList();
    IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
    for (int i = 0; i < projects.length; i++) {
        if (projects[i].isOpen()) {
            input.add(projects[i]);
        }
    }

    this.resourceGroup = new ResourceTreeAndListGroup(parent, input, getResourceProvider(IResource.FOLDER
            | IResource.PROJECT), WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
            getResourceProvider(IResource.FILE), WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
            SWT.NONE, DialogUtil.inRegularFontMode(parent));

    ICheckStateListener listener = new ICheckStateListener() {
        public void checkStateChanged(CheckStateChangedEvent event) {
            updateWidgetEnablements();
        }
    };

    this.resourceGroup.addCheckStateListener(listener);
}
OverrideMethodsPage.java 文件源码 项目:Pydev 阅读 24 收藏 0 点赞 0 评论 0
private void createTreeViewer(Composite treeComp) {
    treeViewer = new ContainerCheckedTreeViewer(treeComp);
    treeViewer.addCheckStateListener(new ICheckStateListener() {
        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            processSelectionChange();
        }
    });

    treeViewer.setContentProvider(classProvider);
    treeViewer.setLabelProvider(labelProvider);
    treeViewer.setAutoExpandLevel(2);
    // treeViewer.addFilter(new MethodViewerFilter());
    treeViewer.setUseHashlookup(true);
    treeViewer.setInput("");
    treeViewer.setSelection(new StructuredSelection(treeViewer.getExpandedElements()[0]));
}
GeneratePropertiesPage.java 文件源码 项目:Pydev 阅读 24 收藏 0 点赞 0 评论 0
private void createTreeViewer(Composite treeComp) {
    treeViewer = new ContainerCheckedTreeViewer(treeComp);
    treeViewer.addCheckStateListener(new ICheckStateListener() {
        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            getRequestProcsseor().setCheckedElements(treeViewer.getCheckedElements());
            GeneratePropertiesPage.this.getWizard().getContainer().updateButtons();
        }
    });

    treeViewer.setContentProvider(classProvider);
    treeViewer.setLabelProvider(labelProvider);
    treeViewer.setAutoExpandLevel(2);
    treeViewer.setInput("");
    treeViewer.setSelection(new StructuredSelection(treeViewer.getExpandedElements()[0]));
}
ConstructorFieldPage.java 文件源码 项目:Pydev 阅读 30 收藏 0 点赞 0 评论 0
private void createTreeViewer(Composite treeComp) {
    treeViewer = new ContainerCheckedTreeViewer(treeComp);
    treeViewer.addCheckStateListener(new ICheckStateListener() {
        @Override
        public void checkStateChanged(CheckStateChangedEvent event) {
            getRequestProcessor().setCheckedElements(treeViewer.getCheckedElements());
            ConstructorFieldPage.this.getWizard().getContainer().updateButtons();
        }
    });

    treeViewer.setContentProvider(classProvider);
    treeViewer.setLabelProvider(labelProvider);
    treeViewer.setAutoExpandLevel(2);
    treeViewer.setInput("");
    treeViewer.setSelection(new StructuredSelection(treeViewer.getExpandedElements()[0]));
}
RulesCheckListener.java 文件源码 项目:eclipse-ast-refactor 阅读 25 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
    Object element = event.getElement();
    if (element instanceof ASTRuleDescriptor) {
        ASTRuleDescriptor descriptor = (ASTRuleDescriptor) element;

        // If element is mandatory, it should always remain checked !
        if (descriptor.isMandatory()) {
            event.getCheckable().setChecked(event.getElement(), true);
            return;
        }

        // Now, if not mandatory, we save the state.
        if (states.containsKey(descriptor))
            states.remove(descriptor);
        states.put(descriptor, !event.getChecked());
    }
}
ProjectWizard.java 文件源码 项目:cuina 阅读 91 收藏 0 点赞 0 评论 0
@Override
        public void checkStateChanged(CheckStateChangedEvent e)
        {
            if (update) return;
            update = true;

//          String pluginName = ((CuinaPlugin) e.getElement()).getName();

//          if (e.getChecked())
//              plugins.add(pluginName);
//          else
//              plugins.remove(pluginName);
//          cuinaTab.updateTab();

            update = false;
        }
PluginBlock.java 文件源码 项目:cuina 阅读 21 收藏 0 点赞 0 评论 0
@Override
public void checkStateChanged(CheckStateChangedEvent e)
{
    if (update) return;
    update = true;

    String pluginName = ((CuinaPlugin) e.getElement()).getName();

    if (e.getChecked())
        plugins.add(pluginName);
    else
        plugins.remove(pluginName);
    cuinaTab.updateTab();

    update = false;
}
LabItemTreeSelectionComposite.java 文件源码 项目:elexis-3-core 阅读 23 收藏 0 点赞 0 评论 0
private void rememberLeafCheckState(CheckStateChangedEvent event){
    Object[] checked = laborViewer.getCheckedElements();
    if (checkState == null) {
        checkState = new ArrayList<GroupItem>(checked.length);
    }
    for (int i = 0; i < checked.length; i++) {
        if (!laborViewer.getGrayed(checked[i])) {
            if (!checkState.contains(checked[i])) {
                if (checked[i] instanceof GroupItem) {
                    checkState.add((GroupItem) checked[i]);
                } else
                    if ((checked[i] instanceof Group) && (event.getElement() == checked[i])) {
                    checkState.addAll(((Group) checked[i]).items);
                }
            }
        }
    }
}
PsfImportWizardFilesSelectionPage.java 文件源码 项目:psf-import 阅读 32 收藏 0 点赞 0 评论 0
/**
 * An item was checked in one of self's two views. Determine which view this
 * occurred in and delegate appropriately
 * 
 * @param event
 *            CheckStateChangedEvent
 */
public void checkListStateChanged(final CheckStateChangedEvent event) {

    // Potentially long operation - show a busy cursor
    BusyIndicator.showWhile(treeViewer.getControl().getDisplay(), new Runnable() {
        public void run() {
            if (event.getCheckable().equals(treeViewer)) {
                treeItemChecked((FileElement) event.getElement(), event.getChecked());
            } else {
                listItemChecked((FileElement) event.getElement(), event.getChecked(), true);
            }

            notifyCheckStateChangeListeners(event);
        }
    });
}


问题


面经


文章

微信
公众号

扫码关注公众号