public DetailedEditor(final Display display, final List<String> headerList,
			final CSVRow row, String inCellDelimiter, String regexTableMarker) {

		shell = new Shell(display);
		shell.setLayout(new FillLayout());
		shell.setText("Detailed CSV edition");

		shell.setSize(800, 600);

		// If there is more columns for the header than there is for the column,
		// we had empty columns in the row
		// It happen when the row's last columns are empty and separators are
		// forgotten.
		// The CSV reader can't guess there is a column to create
		if (row.getNumberOfElements() > 0
				&& headerList.size() > row.getNumberOfElements()) {
			for (int i = row.getNumberOfElements() - 1; i < headerList.size(); i++) {
				row.addElement("");
			}
		}

		this.headerList = headerList;
		this.row = row;

		this.inCellDelimiter = inCellDelimiter;
		this.regexTableMarker = regexTableMarker;
		
		ScrolledComposite scrolledComposite = new ScrolledComposite(shell,
				SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);

		Composite composite = new Composite(scrolledComposite, SWT.NONE);
		composite.setLayout(new GridLayout(2, false));

		generateComponents(composite);
		new Label(composite, SWT.NONE);

		Composite compositeBtn = new Composite(composite, SWT.NONE);
		GridData gd_compositeBtn = new GridData(SWT.LEFT, SWT.CENTER, false,
				false, 1, 1);
		gd_compositeBtn.heightHint = 55;
		gd_compositeBtn.widthHint = 220;
		compositeBtn.setLayoutData(gd_compositeBtn);

		Button btnApply = new Button(compositeBtn, SWT.NONE);
		btnApply.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
			}
		});
		btnApply.setBounds(19, 14, 75, 30);
		btnApply.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				switch (e.type) {
				case SWT.Selection:
					updateRow();
					shell.dispose();
					break;
				}
			}
		});
		btnApply.setText("Apply");

		Button btnCancel = new Button(compositeBtn, SWT.NONE);
		btnCancel.setBounds(141, 14, 75, 30);
		btnCancel.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				switch (e.type) {
				case SWT.Selection:
					shell.dispose();
					break;
				}
			}
		});
		btnCancel.setText("Cancel");

		shell.setMinimumSize(400, 200);

		scrolledComposite.setContent(composite);
		scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT,
				SWT.DEFAULT));

		// The components must be filled only after the scrolled composite size
		// has been set
		// Otherwise the size of the scrolled composite would adapt its size to
		// the content of its components
		fillComponents();
	}