Package org.gudy.azureus2.ui.swt.views.columnsetup

Source Code of org.gudy.azureus2.ui.swt.views.columnsetup.TableColumnSetupWindow$TableViewColumnSetup

/**
* Created on Jan 3, 2009
*
* Copyright 2008 Vuze, Inc.  All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

package org.gudy.azureus2.ui.swt.views.columnsetup;

import java.util.*;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.shell.ShellFactory;
import org.gudy.azureus2.ui.swt.shells.GCStringPrinter;
import org.gudy.azureus2.ui.swt.views.table.TableOrTreeSWT;
import org.gudy.azureus2.ui.swt.views.table.TableRowSWT;
import org.gudy.azureus2.ui.swt.views.table.impl.TableOrTreeUtils;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewSWTImpl;

import com.aelitis.azureus.ui.common.table.*;
import com.aelitis.azureus.ui.common.table.impl.TableColumnManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
import com.aelitis.azureus.ui.swt.uiupdater.UIUpdaterSWT;

import org.gudy.azureus2.plugins.ui.tables.TableColumn;
import org.gudy.azureus2.plugins.ui.tables.TableColumnInfo;
import org.gudy.azureus2.plugins.ui.tables.TableRow;

/**
* @author TuxPaper
* @created Jan 3, 2009
*
*/
public class TableColumnSetupWindow
  implements UIUpdatable
{
  private static final String TABLEID_AVAIL = "ColumnSetupAvail";

  private static final String TABLEID_CHOSEN = "ColumnSetupChosen";

  private static final boolean CAT_BUTTONS = true;

  private Shell shell;

  private TableViewColumnSetup tvAvail;

  private final String forTableID;

  private final Class forDataSourceType;

  private Composite cTableAvail;

  private Composite cCategories;

  private TableViewColumnSetup tvChosen;

  private Composite cTableChosen;

  private TableColumnCore[] columnsChosen;

  private final TableRow sampleRow;

  private DragSourceListener dragSourceListener;

  private final TableStructureModificationListener listener;

  private TableColumnCore[] columnsOriginalOrder;

  protected boolean apply = false;

  private Button[] radProficiency = new Button[3];

  private Map<TableColumnCore, Boolean> mapNewVisibility = new HashMap();

  private ArrayList<TableColumnCore> listColumnsNoCat;

  private ArrayList<String> listCats;

  private Combo comboFilter;

  private Group cPickArea;

  protected boolean doReset;

  public TableColumnSetupWindow(final Class forDataSourceType, String _tableID,
      TableRow sampleRow, TableStructureModificationListener _listener) {
    this.sampleRow = sampleRow;
    this.listener = _listener;
    FormData fd;
    this.forDataSourceType = forDataSourceType;
    forTableID = _tableID;

    dragSourceListener = new DragSourceListener() {
      private TableColumnCore tableColumn;

      public void dragStart(DragSourceEvent event) {
        event.doit = true;

        TableOrTreeSWT table = TableOrTreeUtils.getTableOrTreeSWT(((DragSource) event.widget).getControl());
        TableView tv = (TableView) table.getData("TableView");
        // drag start happens a bit after the mouse moves, so the
        // cursor location isn't accurate
        //Point cursorLocation = event.display.getCursorLocation();
        //cursorLocation = tv.getTableComposite().toControl(cursorLocation);
        //TableRowCore row = tv.getRow(cursorLocation.x, cursorLocation.y);
        //System.out.println("" + event.x + ";" + event.y + "/" + cursorLocation);

        // event.x and y doesn't always return correct values!
        //TableRowCore row = tv.getRow(event.x, event.y);

        TableRowCore row = tv.getFocusedRow();
        if (row == null) {
          event.doit = false;
          return;
        }

        tableColumn = (TableColumnCore) row.getDataSource();

        if (event.image != null && !Constants.isLinux) {
          try {
            GC gc = new GC(event.image);
            try {
              Rectangle bounds = event.image.getBounds();
              gc.fillRectangle(bounds);
              String title = MessageText.getString(
                  tableColumn.getTitleLanguageKey(), tableColumn.getName());
              String s = title
                  + " Column will be placed at the location you drop it, shifting other columns down";
              GCStringPrinter sp = new GCStringPrinter(gc, s, bounds, false, false,
                  SWT.CENTER | SWT.WRAP);
              sp.calculateMetrics();
              if (sp.isCutoff()) {
                GCStringPrinter.printString(gc, title, bounds, false, false,
                    SWT.CENTER | SWT.WRAP);
              } else {
                sp.printString();
              }
            } finally {
              gc.dispose();
            }
          } catch (Throwable t) {
            //ignore
          }
        }
      }

      public void dragSetData(DragSourceEvent event) {
        TableOrTreeSWT table = TableOrTreeUtils.getTableOrTreeSWT(((DragSource) event.widget).getControl());
        TableView tv = (TableView) table.getData("TableView");
        event.data = "" + (tv == tvChosen ? "c" : "a");
      }

      public void dragFinished(DragSourceEvent event) {
      }
    };
   
    String tableName = MessageText.getString(_tableID + "View.header",
        (String) null);
    if (tableName == null) {
      tableName = MessageText.getString(_tableID + "View.title.full",
          (String) null);
      if (tableName == null) {
        tableName = _tableID;
      }
    }
   

    shell = ShellFactory.createShell(Utils.findAnyShell(), SWT.SHELL_TRIM);
    Utils.setShellIcon(shell);
    FormLayout formLayout = new FormLayout();
    shell.setText(MessageText.getString("ColumnSetup.title", new String[] {
      tableName
    }));
    shell.setLayout(formLayout);
    shell.setSize(780, 550);

    shell.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent e) {
        close();
      }
    });

    Label topInfo = new Label(shell, SWT.WRAP);
    Messages.setLanguageText(topInfo, "ColumnSetup.explain");

    fd = Utils.getFilledFormData();
    fd.left.offset = 5;
    fd.top.offset = 5;
    fd.bottom = null;
    topInfo.setLayoutData(fd);

    Button btnOk = new Button(shell, SWT.PUSH);
    Messages.setLanguageText(btnOk, "Button.ok");
    btnOk.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        apply = true;
        shell.dispose();
      }
    });

    cPickArea = new Group(shell, SWT.NONE);
    cPickArea.setLayout(new FormLayout());


    final ExpandBar expandFilters = new ExpandBar(cPickArea, SWT.NONE);
    expandFilters.setSpacing(1);
   
    final Composite cFilterArea = new Composite(expandFilters, SWT.NONE);
    cFilterArea.setLayout(new FormLayout());

    final TableColumnManager tcm = TableColumnManager.getInstance();

    Group cResultArea = new Group(shell, SWT.NONE);
    Messages.setLanguageText(cResultArea, "ColumnSetup.chosencolumns");
    cResultArea.setLayout(new FormLayout());
   
    Composite cResultButtonArea = new Composite(cResultArea, SWT.NONE);
    cResultButtonArea.setLayout(new FormLayout());

    tvAvail = createTVAvail();

    cTableAvail = new Composite(cPickArea, SWT.NO_FOCUS);
    GridLayout gridLayout = new GridLayout();
    gridLayout.marginWidth = gridLayout.marginHeight = 0;
    cTableAvail.setLayout(gridLayout);

    tvAvail.initialize(cTableAvail);

    TableColumnCore[] datasources = tcm.getAllTableColumnCoreAsArray(
        forDataSourceType, forTableID);

    listColumnsNoCat = new ArrayList<TableColumnCore>(
        Arrays.asList(datasources));
    listCats = new ArrayList<String>();
    for (int i = 0; i < datasources.length; i++) {
      TableColumnCore column = datasources[i];
      TableColumnInfo info = tcm.getColumnInfo(forDataSourceType, forTableID,
          column.getName());
      if (info != null) {
        String[] categories = info.getCategories();
        if (categories != null && categories.length > 0) {
          for (int j = 0; j < categories.length; j++) {
            String cat = categories[j];
            if (!listCats.contains(cat)) {
              listCats.add(cat);
            }
          }
          listColumnsNoCat.remove(column);
        }
      }
    }

    Listener radListener = new Listener() {
      public void handleEvent(Event event) {
        fillAvail();
      }
    };


    Composite cProficiency = new Composite(cFilterArea, SWT.NONE);
    cProficiency.setBackgroundMode(SWT.INHERIT_FORCE);
    cProficiency.setLayout(new FormLayout());

    Label lblProficiency = new Label(cProficiency, SWT.NONE);
    Messages.setLanguageText(lblProficiency, "ColumnSetup.proficiency");

    radProficiency[0] = new Button(cProficiency, SWT.RADIO);
    Messages.setLanguageText(radProficiency[0], "ConfigView.section.mode.beginner");
    fd = new FormData();
    fd.left = new FormAttachment(lblProficiency, 5);
    radProficiency[0].setLayoutData(fd);
    radProficiency[0].addListener(SWT.Selection, radListener);

    radProficiency[1] = new Button(cProficiency, SWT.RADIO);
    Messages.setLanguageText(radProficiency[1], "ConfigView.section.mode.intermediate");
    fd = new FormData();
    fd.left = new FormAttachment(radProficiency[0], 5);
    radProficiency[1].setLayoutData(fd);
    radProficiency[1].addListener(SWT.Selection, radListener);

    radProficiency[2] = new Button(cProficiency, SWT.RADIO);
    Messages.setLanguageText(radProficiency[2], "ConfigView.section.mode.advanced");
    fd = new FormData();
    fd.left = new FormAttachment(radProficiency[1], 5);
    radProficiency[2].setLayoutData(fd);
    radProficiency[2].addListener(SWT.Selection, radListener);

    int userMode = COConfigurationManager.getIntParameter("User Mode");
    if (userMode < 0) {
      userMode = 0;
    } else if (userMode >= radProficiency.length) {
      userMode = radProficiency.length - 1;
    }
    radProficiency[userMode].setSelection(true);

    // >>>>>>>> Buttons

    Listener buttonListener = new Listener() {
      public void handleEvent(Event event) {
        Control[] children = cCategories.getChildren();
        for (int i = 0; i < children.length; i++) {
          Control child = children[i];
          if (child != event.widget && (child instanceof Button)) {
            Button btn = (Button) child;
            btn.setSelection(false);
          }
        }
       
        fillAvail();
      }
    };
   
    Label lblCat = new Label(cFilterArea, SWT.NONE);
    Messages.setLanguageText(lblCat, "ColumnSetup.categories");
   
    if (CAT_BUTTONS) {
      cCategories = new Composite(cFilterArea, SWT.NONE);
      cCategories.setLayout(new RowLayout());

      Button button = new Button(cCategories, SWT.TOGGLE);
      Messages.setLanguageText(button, "Categories.all");
      button.addListener(SWT.Selection, buttonListener);
      button.setSelection(true);
 
      for (String cat : listCats) {
        button = new Button(cCategories, SWT.TOGGLE);
        button.setData("cat", cat);
        if (MessageText.keyExists("ColumnCategory." + cat)) {
          button.setText(MessageText.getString("ColumnCategory." + cat));
        } else {
          button.setText(cat);
        }
        button.addListener(SWT.Selection, buttonListener);
      }
 
      if (listColumnsNoCat.size() > 0) {
        button = new Button(cCategories, SWT.TOGGLE);
        if (MessageText.keyExists("ColumnCategory.uncat")) {
          button.setText(MessageText.getString("ColumnCategory.uncat"));
        } else {
          button.setText("?");
        }
        button.setText("?");
        button.setData("cat", "uncat");
        button.addListener(SWT.Selection, buttonListener);
      }
    } else {
      comboFilter = new Combo(cFilterArea, SWT.DROP_DOWN | SWT.READ_ONLY);
      comboFilter.addListener(SWT.Selection, radListener);

      listCats.add(0, "all");
      for (String cat : listCats) {
        comboFilter.add(cat);
      }
      comboFilter.select(0);
    }
   
    final ExpandItem expandItemFilters = new ExpandItem(expandFilters, SWT.NONE);
    expandItemFilters.setText(MessageText.getString("ColumnSetup.filters"));
    expandItemFilters.setControl(cFilterArea);
    expandFilters.addListener(SWT.Resize, new Listener() {
      public void handleEvent(Event event) {
        expandItemFilters.setHeight(cFilterArea.computeSize(
            expandFilters.getSize().x, SWT.DEFAULT).y + 3);
      }
    });

    expandFilters.addListener(SWT.Expand, new Listener() {
      public void handleEvent(Event event) {
        Utils.execSWTThreadLater(Constants.isLinux ? 250 : 0, new AERunnable() {
          public void runSupport() {
            shell.layout(true, true);
          }
        });
      }
    });
    expandFilters.addListener(SWT.Collapse, new Listener() {
      public void handleEvent(Event event) {
        Utils.execSWTThreadLater(Constants.isLinux ? 250 : 0, new AERunnable() {
          public void runSupport() {
            shell.layout(true, true);
          }
        });
      }
    });
   

    // <<<<<<< Buttons
   
    // >>>>>>> Chosen

    ImageLoader imageLoader = ImageLoader.getInstance();

    Button btnUp = new Button(cResultButtonArea, SWT.PUSH);
    imageLoader.setButtonImage(btnUp, "up");
    btnUp.addSelectionListener(new SelectionListener() {
      public void widgetSelected(SelectionEvent e) {
        moveChosenUp();
      }

      public void widgetDefaultSelected(SelectionEvent e) {
      }
    });

    Button btnDown = new Button(cResultButtonArea, SWT.PUSH);
    imageLoader.setButtonImage(btnDown, "down");
    btnDown.addSelectionListener(new SelectionListener() {
      public void widgetSelected(SelectionEvent e) {
        moveChosenDown();
      }

      public void widgetDefaultSelected(SelectionEvent e) {
      }
    });

    Button btnDel = new Button(cResultButtonArea, SWT.PUSH);
    imageLoader.setButtonImage(btnDel, "delete");
    btnDel.addSelectionListener(new SelectionListener() {
      public void widgetSelected(SelectionEvent e) {
        removeSelectedChosen();
      }

      public void widgetDefaultSelected(SelectionEvent e) {
      }
    });

    tvChosen = createTVChosen();

    cTableChosen = new Composite(cResultArea, SWT.NONE);
    gridLayout = new GridLayout();
    gridLayout.marginWidth = gridLayout.marginHeight = 0;
    cTableChosen.setLayout(gridLayout);

    tvChosen.initialize(cTableChosen);

    columnsChosen = tcm.getAllTableColumnCoreAsArray(forDataSourceType,
        forTableID);
    Arrays.sort(columnsChosen,
        TableColumnManager.getTableColumnOrderComparator());
    columnsOriginalOrder = new TableColumnCore[columnsChosen.length];
    System.arraycopy(columnsChosen, 0, columnsOriginalOrder, 0,
        columnsChosen.length);
    int pos = 0;
    for (int i = 0; i < columnsChosen.length; i++) {
      boolean visible = columnsChosen[i].isVisible();
      mapNewVisibility.put(columnsChosen[i], new Boolean(visible));
      if (visible) {
        columnsChosen[i].setPositionNoShift(pos++);
        tvChosen.addDataSource(columnsChosen[i]);
      }
    }
    tvChosen.processDataSourceQueue();

   
    Button btnReset = null;
    String[] defaultColumnNames = tcm.getDefaultColumnNames(forTableID);
    if (defaultColumnNames != null) {
      btnReset = new Button(cResultButtonArea, SWT.PUSH);
      Messages.setLanguageText(btnReset, "Button.reset");
      btnReset.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
          String[] defaultColumnNames = tcm.getDefaultColumnNames(forTableID);
          if (defaultColumnNames != null) {
            List<TableColumnCore> defaultColumns = new ArrayList<TableColumnCore>();
            for (String name : defaultColumnNames) {
              TableColumnCore column = tcm.getTableColumnCore(forTableID, name);
              if (column != null) {
                defaultColumns.add(column);
              }
            }
            if (defaultColumns.size() > 0) {
              for (TableColumnCore tc : mapNewVisibility.keySet()) {
                mapNewVisibility.put(tc, Boolean.FALSE);
              }
              tvChosen.removeAllTableRows();
              columnsChosen = defaultColumns.toArray(new TableColumnCore[0]);
              for (int i = 0; i < columnsChosen.length; i++) {
                mapNewVisibility.put(columnsChosen[i], Boolean.TRUE);
                columnsChosen[i].setPositionNoShift(i);
                tvChosen.addDataSource(columnsChosen[i]);
              }
              doReset = true;
            }
          }
        }
      });
    }
   
    final Button btnCancel = new Button(shell, SWT.PUSH);
    Messages.setLanguageText(btnCancel, "Button.cancel");
    btnCancel.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        shell.dispose();
      }
    });

    Button btnApply = new Button(cResultButtonArea, SWT.PUSH);
    Messages.setLanguageText(btnApply, "Button.apply");
    btnApply.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        apply();
        btnCancel.setEnabled(false);
      }
    });

    fd = new FormData();
    fd.left = new FormAttachment(0, 5);
    fd.right = new FormAttachment(100, -5);
    //fd.bottom = new FormAttachment(100, -5);
    //lblChosenHeader.setLayoutData(fd);

    fd = new FormData();
    fd.top = new FormAttachment(topInfo, 5);
    fd.right = new FormAttachment(100, -3);
    fd.bottom = new FormAttachment(btnOk, -5);
    fd.width = 200;
    cResultArea.setLayoutData(fd);
   
    fd = new FormData();
    fd.bottom = new FormAttachment(100, 0);
    fd.left = new FormAttachment(cTableChosen, 0, SWT.CENTER);
    //fd.right = new FormAttachment(100, 0);
    cResultButtonArea.setLayoutData(fd);

    fd = new FormData();
    fd.right = new FormAttachment(btnDown, -5);
    fd.bottom = new FormAttachment(btnApply, -3);
    btnUp.setLayoutData(fd);

    fd = new FormData();
    fd.right = new FormAttachment(btnDel, -5);
    fd.top = new FormAttachment(btnUp, 0, SWT.TOP);
    fd.bottom = new FormAttachment(btnUp, 0, SWT.BOTTOM);
    btnDown.setLayoutData(fd);

    fd = new FormData();
    fd.right = new FormAttachment(100, -5);
    fd.top = new FormAttachment(btnUp, 0, SWT.TOP);
    fd.bottom = new FormAttachment(btnUp, 0, SWT.BOTTOM);
    btnDel.setLayoutData(fd);

    fd = new FormData();
    fd.top = new FormAttachment(0, 3);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    //fd.bottom = new FormAttachment(100, 0);
    fd.bottom = new FormAttachment(cResultButtonArea, -3, SWT.TOP);
    cTableChosen.setLayoutData(fd);
   
    if (btnReset != null) {
      fd = new FormData();
      fd.right = new FormAttachment(btnApply, -3);
      fd.bottom = new FormAttachment(btnApply, 0, SWT.BOTTOM);
      btnReset.setLayoutData(fd);
    }

    fd = new FormData();
    fd.right = new FormAttachment(100, -5);
    fd.bottom = new FormAttachment(100, -3);
    //fd.width = 64;
    btnApply.setLayoutData(fd);

    fd = new FormData();
    fd.right = new FormAttachment(100, -8);
    fd.bottom = new FormAttachment(100, -3);
    //fd.width = 65;
    btnCancel.setLayoutData(fd);

    fd = new FormData();
    fd.right = new FormAttachment(btnCancel, -3);
    fd.bottom = new FormAttachment(btnCancel, 0, SWT.BOTTOM);
    //fd.width = 64;
    btnOk.setLayoutData(fd);

    // <<<<<<<<< Chosen

    fd = new FormData();
    fd.top = new FormAttachment(topInfo, 5);
    fd.left = new FormAttachment(0, 3);
    fd.right = new FormAttachment(cResultArea, -3);
    fd.bottom = new FormAttachment(100, -3);
    cPickArea.setLayoutData(fd);

    fd = new FormData();
    fd.bottom = new FormAttachment(100, 0);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    expandFilters.setLayoutData(fd);


    if (CAT_BUTTONS) {
      fd = new FormData();
      fd.bottom = new FormAttachment(cCategories, 0, SWT.CENTER);
      fd.left = new FormAttachment(0, 5);
      lblCat.setLayoutData(fd);
     
      fd = new FormData();
      //fd.top = new FormAttachment(0, 0);
      fd.bottom = new FormAttachment(radProficiency[0], 0, SWT.CENTER);
      fd.left = new FormAttachment(0, 0);
      lblProficiency.setLayoutData(fd);

      fd = new FormData();
      fd.top = new FormAttachment(cProficiency, 5);
      fd.left = new FormAttachment(lblCat, 5);
      fd.right = new FormAttachment(100, 0);
      cCategories.setLayoutData(fd);
    } else {
      fd = new FormData();
      fd.top = new FormAttachment(comboFilter, -5);
      fd.right = new FormAttachment(comboFilter, 0, SWT.CENTER);
      lblCat.setLayoutData(fd);

      fd = new FormData();
      fd.top = new FormAttachment(cProficiency, 0, SWT.CENTER);
      fd.right = new FormAttachment(100, 0);
      comboFilter.setLayoutData(fd);
    }

    fd = new FormData();
    fd.top = new FormAttachment(0, 5);
    fd.left = new FormAttachment(0, 5);
    cProficiency.setLayoutData(fd);

    fd = new FormData();
    fd.top = new FormAttachment(0, 3);
    fd.left = new FormAttachment(0, 0);
    fd.right = new FormAttachment(100, 0);
    fd.bottom = new FormAttachment(expandFilters, -3);
    cTableAvail.setLayoutData(fd);


    //cTableAvail.setFocus();
    //tvAvail.getTableComposite().setFocus();

    shell.setTabList(new Control[] {
      cPickArea,
      cResultArea,
      btnOk,
      btnCancel,
    });

    cPickArea.setTabList(new Control[] {
      cTableAvail
    });

    fillAvail();
   
    UIUpdaterSWT.getInstance().addUpdater(this);
  }

  /**
   *
   *
   * @since 4.0.0.5
   */
  protected void fillAvail() {
    String selectedCat = null;
    if (CAT_BUTTONS) {
      Control[] children = cCategories.getChildren();
      for (int i = 0; i < children.length; i++) {
        Control child = children[i];
        if (child instanceof Button) {
          Button btn = (Button) child;
          if (btn.getSelection()) {
            selectedCat = (String) btn.getData("cat");
            break;
          }
        }
      }
    } else {
      selectedCat = comboFilter.getItem(comboFilter.getSelectionIndex());
    }
   
    if (selectedCat != null && selectedCat.equals("all")) {
      selectedCat = null;
    }
   
   
    byte selectedProf = 0;
    for (byte i = 0; i < radProficiency.length; i++) {
      Button btn = radProficiency[i];
      if (btn.getSelection()) {
        selectedProf = i;
        break;
      }
    }

    String s;
    //= "Available " + radProficiency[selectedProf].getText() + " Columns";
    if (selectedCat != null) {
      s = MessageText.getString("ColumnSetup.availcolumns.filteredby", new String[] {
        radProficiency[selectedProf].getText(),
        selectedCat
      });
    } else {
      s = MessageText.getString("ColumnSetup.availcolumns", new String[] {
        radProficiency[selectedProf].getText(),
      });
    }
    cPickArea.setText(s);

    tvAvail.removeAllTableRows();

    final TableColumnManager tcm = TableColumnManager.getInstance();
    TableColumnCore[] datasources = tcm.getAllTableColumnCoreAsArray(
        forDataSourceType, forTableID);
   
    if (selectedCat == "uncat") {
      datasources = (TableColumnCore[]) listColumnsNoCat.toArray( new TableColumnCore[listColumnsNoCat.size()]);
    }
    for (int i = 0; i < datasources.length; i++) {
      TableColumnCore column = datasources[i];
      TableColumnInfo info = tcm.getColumnInfo(forDataSourceType,
          forTableID, column.getName());
      String[] cats = info == null ? null : info.getCategories();
      if (cats == null) {
        if (selectedCat == null || selectedCat.equals("uncat")) {
          tvAvail.addDataSource(column);
        }
      } else {
        for (int j = 0; j < cats.length; j++) {
          String cat = cats[j];
          if ((selectedCat == null || selectedCat.equalsIgnoreCase(cat))
              && info.getProficiency() <= selectedProf) {
            tvAvail.addDataSource(column);
            break;
          }
        }
      }
    }
    tvAvail.processDataSourceQueue();
  }

  /**
   *
   *
   * @since 4.0.0.5
   */
  protected void removeSelectedChosen() {
    Object[] datasources = tvChosen.getSelectedDataSources().toArray();
    for (int i = 0; i < datasources.length; i++) {
      TableColumnCore column = (TableColumnCore) datasources[i];
      mapNewVisibility.put(column, Boolean.FALSE);
    }
    tvChosen.removeDataSources(datasources);
    tvChosen.processDataSourceQueue();
    for (int i = 0; i < datasources.length; i++) {
      TableRowSWT row = (TableRowSWT) tvAvail.getRow(datasources[i]);
      if (row != null) {
        row.redraw();
      }
    }
  }

  /**
   *
   *
   * @since 4.0.0.5
   */
  protected void moveChosenDown() {
    TableRowCore[] selectedRows = tvChosen.getSelectedRows();
    TableRowCore[] rows = tvChosen.getRows();
    for (int i = selectedRows.length - 1; i >= 0; i--) {
      TableRowCore row = selectedRows[i];
      TableColumnCore column = (TableColumnCore) row.getDataSource();
      if (column != null) {
        int oldColumnPos = column.getPosition();
        int oldRowPos = row.getIndex();
        if (oldRowPos < rows.length - 1) {
          TableRowCore displacedRow = rows[oldRowPos + 1];
          ((TableColumnCore) displacedRow.getDataSource()).setPositionNoShift(oldColumnPos);
          rows[oldRowPos + 1] = rows[oldRowPos];
          rows[oldRowPos] = displacedRow;
          column.setPositionNoShift(oldColumnPos + 1);
        }
      }
    }
    tvChosen.tableInvalidate();
    tvChosen.refreshTable(true);
  }

  /**
   *
   *
   * @since 4.0.0.5
   */
  protected void moveChosenUp() {
    TableRowCore[] selectedRows = tvChosen.getSelectedRows();
    TableRowCore[] rows = tvChosen.getRows();
    for (int i = 0; i < selectedRows.length; i++) {
      TableRowCore row = selectedRows[i];
      TableColumnCore column = (TableColumnCore) row.getDataSource();
      if (column != null) {
        int oldColumnPos = column.getPosition();
        int oldRowPos = row.getIndex();
        if (oldRowPos > 0) {
          TableRowCore displacedRow = rows[oldRowPos - 1];
          ((TableColumnCore) displacedRow.getDataSource()).setPositionNoShift(oldColumnPos);
          rows[oldRowPos - 1] = rows[oldRowPos];
          rows[oldRowPos] = displacedRow;
          column.setPositionNoShift(oldColumnPos - 1);
        }
      }
    }
    tvChosen.tableInvalidate();
    tvChosen.refreshTable(true);
  }

  /**
   *
   *
   * @since 4.0.0.5
   */
  protected void apply() {
    for (TableColumnCore tc : mapNewVisibility.keySet()) {
      boolean visible = mapNewVisibility.get(tc).booleanValue();
      tc.setVisible(visible);
      if (doReset) {
        tc.reset();
      }
    }
    TableColumnManager.getInstance().saveTableColumns(forDataSourceType,
        forTableID);
    listener.tableStructureChanged(true, forDataSourceType);
  }

  /**
   * @return
   *
   * @since 4.0.0.5
   */
  private TableViewColumnSetup createTVChosen() {
    final TableColumnManager tcm = TableColumnManager.getInstance();
    TableColumnCore[] columnTVChosen = tcm.getAllTableColumnCoreAsArray(
        TableColumn.class, TABLEID_CHOSEN);
    for (int i = 0; i < columnTVChosen.length; i++) {
      TableColumnCore column = columnTVChosen[i];
      if (column.getName().equals(ColumnTC_ChosenColumn.COLUMN_ID)) {
        column.setVisible(true);
        column.setWidth(175);
        column.setSortAscending(true);
      } else {
        column.setVisible(false);
      }
    }

    final TableViewColumnSetup tvChosen = new TableViewColumnSetup(
        this, TableColumn.class, TABLEID_CHOSEN, columnTVChosen,
        ColumnTC_ChosenColumn.COLUMN_ID, true);
    tvChosen.setMenuEnabled(false);
    tvChosen.setSampleRow(sampleRow);
    tvChosen.setHeaderVisible(false);
    //tvChosen.setRowDefaultHeight(16);

    tvChosen.addLifeCycleListener(new TableLifeCycleListener() {
      private DragSource dragSource;
      private DropTarget dropTarget;

      public void tableViewInitialized() {
        dragSource = tvChosen.createDragSource(DND.DROP_MOVE | DND.DROP_COPY
            | DND.DROP_LINK);
        dragSource.setTransfer(new Transfer[] {
          TextTransfer.getInstance()
        });
        dragSource.addDragListener(dragSourceListener);

        dropTarget = tvChosen.createDropTarget(DND.DROP_DEFAULT
            | DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK
            | DND.DROP_TARGET_MOVE);
        dropTarget.setTransfer(new Transfer[] {
          TextTransfer.getInstance()
        });
        dropTarget.addDropListener(new DropTargetListener() {

          public void dropAccept(DropTargetEvent event) {
            // TODO Auto-generated method stub

          }

          public void drop(DropTargetEvent event) {
            String id = (String) event.data;
            TableRowCore destRow = tvChosen.getRow(event);

            TableView tv = id.equals("c") ? tvChosen : tvAvail;

            Object[] dataSources = tv.getSelectedDataSources().toArray();
            for (int i = 0; i < dataSources.length; i++) {
              TableColumnCore column = (TableColumnCore) dataSources[i];
              if (column != null) {
                chooseColumn(column, destRow, true);
                TableRowCore row = tvAvail.getRow(column);
                if (row != null) {
                  row.redraw();
                }
              }
            }
          }

          public void dragOver(DropTargetEvent event) {
            // TODO Auto-generated method stub

          }

          public void dragOperationChanged(DropTargetEvent event) {
            // TODO Auto-generated method stub

          }

          public void dragLeave(DropTargetEvent event) {
            // TODO Auto-generated method stub

          }

          public void dragEnter(DropTargetEvent event) {
            // TODO Auto-generated method stub

          }
        });
      }

      public void tableViewDestroyed() {
        if (dragSource != null && !dragSource.isDisposed()) {
          dragSource.dispose();
        }
        if (dropTarget != null && !dropTarget.isDisposed()) {
          dropTarget.dispose();
        }
      }
    });

    tvChosen.addKeyListener(new KeyListener() {
      public void keyReleased(KeyEvent e) {
      }

      public void keyPressed(KeyEvent e) {
        if (e.stateMask == 0
            && (e.keyCode == SWT.ARROW_LEFT || e.keyCode == SWT.DEL)) {
          removeSelectedChosen();
          e.doit = false;
        }

        if (e.stateMask == SWT.CONTROL) {
          if (e.keyCode == SWT.ARROW_UP) {
            moveChosenUp();
            e.doit = false;
          } else if (e.keyCode == SWT.ARROW_DOWN) {
            moveChosenDown();
            e.doit = false;
          }
        }
      }
    });
    return tvChosen;
  }

  /**
   * @return
   *
   * @since 4.0.0.5
   */
  private TableViewColumnSetup createTVAvail() {
    final TableColumnManager tcm = TableColumnManager.getInstance();
    Map mapColumns = tcm.getTableColumnsAsMap(TableColumn.class, TABLEID_AVAIL);
    TableColumnCore[] columns;
    int[] widths = { 405, 120 };
    if (sampleRow == null) {
      columns = new TableColumnCore[] {
        (TableColumnCore) mapColumns.get(ColumnTC_NameInfo.COLUMN_ID),
      };
      widths = new int[] { 525 };
    } else {
      columns = new TableColumnCore[] {
        (TableColumnCore) mapColumns.get(ColumnTC_NameInfo.COLUMN_ID),
        (TableColumnCore) mapColumns.get(ColumnTC_Sample.COLUMN_ID),
      };
    }
    for (int i = 0; i < columns.length; i++) {
      TableColumnCore column = columns[i];
      if (column != null) {
        column.setVisible(true);
        column.setPositionNoShift(i);
        column.setWidth(widths[i]);
      }
    }

    final TableViewColumnSetup tvAvail = new TableViewColumnSetup(this,
        TableColumn.class, TABLEID_AVAIL, columns,
        ColumnTC_NameInfo.COLUMN_ID, false);
    tvAvail.setMenuEnabled(false);
    tvAvail.setSampleRow(sampleRow);
    tvAvail.setRowDefaultHeight(65);

    tvAvail.addLifeCycleListener(new TableLifeCycleListener() {
      private DragSource dragSource;
      private DropTarget dropTarget;

      public void tableViewInitialized() {
        dragSource = tvAvail.createDragSource(DND.DROP_MOVE | DND.DROP_COPY
            | DND.DROP_LINK);
        dragSource.setTransfer(new Transfer[] {
          TextTransfer.getInstance()
        });
        dragSource.addDragListener(dragSourceListener);

     
        dropTarget = tvAvail.createDropTarget(DND.DROP_DEFAULT
            | DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK
            | DND.DROP_TARGET_MOVE);
        dropTarget.setTransfer(new Transfer[] {
          TextTransfer.getInstance()
        });
        dropTarget.addDropListener(new DropTargetAdapter() {
          public void drop(DropTargetEvent event) {
            String id = (String) event.data;
           
            if (!id.equals("c")) {
              return;
            }

            removeSelectedChosen();
          }
        });
       
      }

      public void tableViewDestroyed() {
        if (dragSource != null && !dragSource.isDisposed()) {
          dragSource.dispose();
        }
        if (dropTarget != null && !dropTarget.isDisposed()) {
          dropTarget.dispose();
        }
      }
    });

    tvAvail.addSelectionListener(new TableSelectionAdapter() {
      public void defaultSelected(TableRowCore[] rows, int stateMask) {
        for (int i = 0; i < rows.length; i++) {
          TableRowCore row = rows[i];
          TableColumnCore column = (TableColumnCore) row.getDataSource();
          chooseColumn(column, null, false);
        }
      }
    }, false);

    tvAvail.addKeyListener(new KeyListener() {
      public void keyReleased(KeyEvent e) {
      }

      public void keyPressed(KeyEvent e) {
        if (e.stateMask == 0) {
          if (e.keyCode == SWT.ARROW_RIGHT) {
            TableRowCore[] selectedRows = tvAvail.getSelectedRows();
            for (int i = 0; i < selectedRows.length; i++) {
              TableRowCore row = selectedRows[i];
              TableColumnCore column = (TableColumnCore) row.getDataSource();
              chooseColumn(column, null, false);
              tvChosen.processDataSourceQueue();
              row.redraw();
            }
            e.doit = false;
          } else if (e.keyCode == SWT.ARROW_LEFT) {
            TableRowCore[] selectedRows = tvAvail.getSelectedRows();
            for (int i = 0; i < selectedRows.length; i++) {
              TableRowCore row = selectedRows[i];
              TableColumnCore column = (TableColumnCore) row.getDataSource();
              mapNewVisibility.put(column, Boolean.FALSE);
              tvChosen.removeDataSource(column);
              tvChosen.processDataSourceQueue();
              row.redraw();
            }
            e.doit = false;
          }
        }
      }
    });

    return tvAvail;
  }

  public void open() {
    shell.open();
  }

  // @see com.aelitis.azureus.ui.common.updater.UIUpdatable#getUpdateUIName()
  public String getUpdateUIName() {
    // TODO Auto-generated method stub
    return null;
  }

  // @see com.aelitis.azureus.ui.common.updater.UIUpdatable#updateUI()
  public void updateUI() {
    if (shell.isDisposed()) {
      UIUpdaterSWT.getInstance().removeUpdater(this);
      return;
    }
    if (tvAvail != null && !tvAvail.isDisposed()) {
      tvAvail.refreshTable(false);
    }
    if (tvChosen != null && !tvChosen.isDisposed()) {
      tvChosen.refreshTable(false);
    }
  }

  public class TableViewColumnSetup
    extends TableViewSWTImpl
  {
    private TableRow sampleRow = null;

    private final TableColumnSetupWindow setupWindow;

    public TableViewColumnSetup(TableColumnSetupWindow setupWindow,
        Class forPluginDataSourceType,
        String tableID, TableColumnCore[] items, String defaultSortOn,
        boolean multi) {
      super(forPluginDataSourceType, tableID, tableID, items, defaultSortOn,
          SWT.FULL_SELECTION | SWT.VIRTUAL | (multi ? SWT.MULTI : SWT.SINGLE));
      this.setupWindow = setupWindow;
    }

    public TableRow getSampleRow() {
      return sampleRow;
    }

    public void setSampleRow(TableRow sampleRow) {
      this.sampleRow = sampleRow;
    }

    public void chooseColumn(TableColumnCore column) {
      setupWindow.chooseColumn(column, null, false);
      TableRowCore row = tvAvail.getRow(column);
      if (row != null) {
        row.redraw();
      }
    }

    public boolean isColumnAdded(TableColumnCore column) {
      TableRowCore row = tvChosen.getRow(column);
      return row != null;
    }
  }

  /**
   * @param column
   *
   * @since 4.0.0.5
   */
  public void chooseColumn(final TableColumnCore column,
      TableRowCore placeAboveRow, boolean ignoreExisting) {
    TableRowCore row = tvChosen.getRow(column);

    if (row == null || ignoreExisting) {
      int newPosition = 0;

      row = placeAboveRow == null && !ignoreExisting ? tvChosen.getFocusedRow()
          : placeAboveRow;
      if (row == null) {
        if (columnsChosen.length > 0) {
          newPosition = columnsChosen.length;
        }
      } else {
        newPosition = ((TableColumn) row.getDataSource()).getPosition();
      }

      int oldPosition = column.getPosition();
      final boolean shiftDir = oldPosition > newPosition
          ||  !mapNewVisibility.get(column).booleanValue();
      column.setPositionNoShift(newPosition);
      mapNewVisibility.put(column, Boolean.TRUE);

      Arrays.sort(columnsChosen, new Comparator() {
        public int compare(Object arg0, Object arg1) {
          if ((arg1 instanceof TableColumn) && (arg0 instanceof TableColumn)) {
            int iPositionA = ((TableColumn) arg0).getPosition();
            if (iPositionA < 0)
              iPositionA = 0xFFFF + iPositionA;
            int iPositionB = ((TableColumn) arg1).getPosition();
            if (iPositionB < 0)
              iPositionB = 0xFFFF + iPositionB;

            int i = iPositionA - iPositionB;
            if (i == 0) {
              if (column == arg0) {
                return shiftDir ? -1 : 1;
              } else {
                return shiftDir ? 1 : -1;
              }
            }
            return i;
          }
          return 0;
        }
      });

      int pos = 0;
      for (int i = 0; i < columnsChosen.length; i++) {
        if (mapNewVisibility.get(columnsChosen[i]).booleanValue()) {
          columnsChosen[i].setPositionNoShift(pos++);
        }
      }

      TableRowCore existingRow = tvChosen.getRow(column);
      if (existingRow == null) {
        tvChosen.addDataSource(column);
        tvChosen.processDataSourceQueue();
        tvChosen.addCountChangeListener(new TableCountChangeListener() {

          public void rowRemoved(TableRowCore row) {
          }

          public void rowAdded(final TableRowCore row) {
            Utils.execSWTThreadLater(500, new AERunnable() {
              public void runSupport() {
                tvChosen.setSelectedRows(new TableRowCore[] { row });
                tvChosen.showRow(row);
              }
            });
            tvChosen.removeCountChangeListener(this);
          }
        });
      }

      tvChosen.tableInvalidate();
      tvChosen.refreshTable(true);

      Arrays.sort(columnsChosen,
          TableColumnManager.getTableColumnOrderComparator());
    } else {
      row.setSelected(true);
    }
  }

  private void close() {
    if (apply) {
      apply();
    } else {
      for (int i = 0; i < columnsOriginalOrder.length; i++) {
        TableColumnCore column = columnsOriginalOrder[i];
        if (column != null) {
          column.setPositionNoShift(i);
        }
      }
    }
  }
}
TOP

Related Classes of org.gudy.azureus2.ui.swt.views.columnsetup.TableColumnSetupWindow$TableViewColumnSetup

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.