Eclipse приложение RCP - дизайн мультиокна для нескольких мониторов

// grid.component.html

<div style="text-align:center">
  ag-grid Example
</div>
<ag-grid-angular #agGrid style="width: 100%; height: 500px;" class="ag-theme-balham" [gridOptions]="gridOptions"
  (gridReady)="onGridReady($event)">
</ag-grid-angular>


// employee.ts

export interface Employee {
    name: string;
    age: number;
    country: string;
    year: number;
    date: number;
    month: string;
    ssn: number;
    address: string;
    zipCode: number;
    occupation: string;
    employer: string;
    employerAddress: string;
    mobNum: number;
}


// grid-component.ts

import { Component, OnInit } from '@angular/core';
import { GridOptions } from 'ag-grid-community';
import { Employee } from './models/employee';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})

export class GridComponent implements OnInit {
  gridOptions: GridOptions;

  constructor() {}

  ngOnInit() {
    this.setGridOptions();
  }

  setGridOptions() {
    this.gridOptions = {
      suppressColumnVirtualisation: true
    } as GridOptions;
  }

  onGridReady(params) {
    this.setData();
  }

  setData() {
    this.gridOptions.api.setColumnDefs(this.getColumnDefinitions());
    this.gridOptions.api.setRowData(this.getData());
    this.autoSizeAll();
    this.gridOptions.api.refreshCells();
  }

  getColumnDefinitions(): Array<any> {
    return [
      {
        field: 'name',
        headerName: 'Name'
      },
      {
        field: 'age',
        headerName: 'Age'
      },
      {
        field: 'country',
        headerName: 'Country'
      },
      {
        headerName: 'Birth Day',
        children: [
          {
            headerName: 'Year',
            field: 'year'
          },
          {
            headerName: 'Month',
            field: 'month'
          },
          {
            headerName: 'Date',
            field: 'date'
          }
        ]
      },
      {
        field: 'ssn',
        headerName: 'Social Security Number'
      },
      {
        field: 'address',
        headerName: 'Address'
      },
      {
        field: 'zipCode',
        headerName: 'Zip Code'
      },
      {
        headerName: 'Occupation Details',
        children: [
          {
            field: 'occupation',
            headerName: 'Occupation'
          },
          {
            field: 'employer',
            headerName: 'Employer'
          },
          {
            field: 'employerAddress',
            headerName: 'Employer Address'
          },
        ]
      },
      {
        field: 'mobNum',
        headerName: 'Mobile Number'
      }
    ];
  }

  getData(): Employee[] {
    return [
      {
        name: 'Mary Smith',
        age: 25,
        country: 'Australia',
        year: 1990,
        date: 14,
        month: 'March',
        ssn: 1234542792102229,
        address: '31 Rainbow Rd, Towers Hill, QLD 4820 31 Rainbow Rd, Towers Hill, QLD 4820',
        zipCode: 11350,
        occupation: 'Engineer',
        employer: 'MicroSoft',
        employerAddress: '245 Rainbow Rd, Microsoft, Towers Hill, QLD 4820',
        mobNum: 7156662910
      },
      {
        name: 'Jeff Martin',
        age: 30,
        country: 'UK',
        year: 1987,
        date: 24,
        month: 'December',
        ssn: 1234542792102229,
        address: '31 Rainbow Rd, Towers Hill, QLD 4820',
        zipCode: 11350,
        occupation: 'UI/UX Designer',
        employer: 'Facebook India',
        employerAddress: '17 Rainbow Rd, Towers Hill, QLD 4820',
        mobNum: 7158462910
      }
    ];
  }

  autoSizeAll() {
    const allColumnIds = [];
    this.gridOptions.columnApi.getAllColumns().forEach((column: any) => {
      allColumnIds.push(column.colId);
    });

    this.gridOptions.columnApi.autoSizeColumns(allColumnIds);
  }

}

Вот что я сделал:

  1. В html - привязка gridOptions и событие onGridReady
  2. В компоненте

    • Инициализация параметры сетки и установите suppressColumnVirtualisation = true.
    • Когда сетка готова, задайте данные для сетки, установив определения столбцов, а затем данные строк.
    • Получите идентификаторы столбцов всех столбцов в сетке и установите их в сетке api autoSizeColumns.

autoSizeColumns () просматривает только ячейки, уже отрисованные на экране. Поэтому ширина столбца устанавливается в зависимости от того, что он видит. Это происходит из-за виртуализации столбцов. Таким образом, столбцы, не видимые на экране, не будут автоматически иметь размер.

Это поведение можно обойти, просто установив suppressColumnVirtualisation = true

Обратите внимание, что сетка использует эту виртуализацию столбцов для повышения производительности сетки при большом количестве столбцов быть оказанным.

5
задан tomash 26 March 2009 в 15:26
поделиться

1 ответ

Единственные инструментальные средства Eclipse могут создать несколько окон. Каждое окно размечается с помощью перспективы, таким образом, различные окна могли быть установлены на другие точки зрения или ту же перспективу, и можно переключить перспективы в каждое окно независимо от других окон.

Можно также установить вход для каждого окна. Это полезно, если каждое окно работает над различными данными (например, каждое окно могло бы быть подключено к различному серверу или могло показывать данные из различных баз данных, что у всех есть та же схема, но различные данные).

Может случиться так использованием окон только так, чтобы Вы видели другие точки зрения тех же данных по различным мониторам. В этом случае Вы не должны программно создавать окна, но должными быть только добавить действие, предоставленное инструментальными средствами. Это может быть сделано путем изменения класса ActionBarAdvisor:

добавьте к объявлениям поля:

private IWorkbenchAction newWindowAction;

добавьте к коду, где Вы делаете действия (обычно метод названный makeActions):

    newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
    register(newWindowAction);

добавьте к коду, где Вы создаете меню:

    menu.add(newWindowAction);

где меню обычно является Меню окна. Если Вы не будете уже иметь Меню окна в Вашем приложении и будете хотеть создать один, то следующая строка будет работать:

    MenuManager menu = new MenuManager(
      "&Window", 
      IWorkbenchActionConstants.M_WINDOW);

Это даст Вам пункт меню, который создаст новое окно таким же образом как Окно-> Новый объект Меню окна в Eclipse IDE.

Если с другой стороны, Вы захотите, чтобы каждое окно показало различные данные затем, то необходимо будет открыть новые окна программно. Это позволяет Вам устанавливать другой вход для каждого окна. Вам будет нужна строка кода что-то как:

IWorkbenchPage newPage = window.openPage(inputObject);

где inputObject содержит информацию, которая определяет данные, показанные в окне. Если Вы хотите установить начальную перспективу, это может быть сделано путем вызова setPerspective на странице.

Вы захотите установить заголовок в каждом окне:

newPage.getWorkbenchWindow().getShell().setText(windowTitle);

где windowTitle является строкой, описывающей вход к окну.

Можно выбрать вход для окна следующим образом:

window.getActivePage().getInput()

Можно затем бросить это к любому классу, который Вы используете в качестве своего входа окна.

7
ответ дан 14 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: