Package com.cicadalane.androlate

Source Code of com.cicadalane.androlate.LoadResourceFilesPage

package com.cicadalane.androlate;

/*
* Copyright (C) 2011 cicada.software@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.statushandlers.StatusManager;
import org.xml.sax.SAXException;

import com.cicadalane.androlate.statushandlers.AndrolateStatus;

/*
* Find and load resource XML files
*/
class LoadResourceFilesPage extends AndrolateWizardPage implements Listener {
  private Table mFileList = null;
  private Table mIgnoreStringTable = null;
  private Button mSelectAllFilesButton = null;
  private Button mSelectAllIgnoreButton = null;
  private Button mSelectAllTranslateButton = null;
  private Table mTranslateStringTable = null;
  private AndrolateOperation selectedOperation = null;

  protected LoadResourceFilesPage(String pageName) {
    super(pageName);
    setTitle(pageName);
    setDescription("Select the resources you would like translated");
    setPageComplete(false);
  }

  private void bind(Androlate a, Androlate saved) {
    mFileList.removeAll();
    List<AndrolateOperation> operations = a.getOperations();
    for (AndrolateOperation o : operations) {
      String filename = o.getFilename();
      java.io.File projectFilePath = getAndrolateWizard()
          .getProjectPath().toFile();
      String filenameDisplay = AndrolateApplication.stringIntersection(
          filename, projectFilePath.getAbsolutePath());

      TableItem fileListTi = new TableItem(mFileList, SWT.NONE);
      fileListTi.setText(new String[] { filenameDisplay });
      fileListTi.setData(o);
      if (saved != null) {
        List<AndrolateOperation> savedOperations = saved
            .getOperations();
        for (AndrolateOperation savedOperation : savedOperations) {
          if (o.getFilename().equals(savedOperation.getFilename())) {
            fileListTi.setChecked(true);
          }
        }
      }
    }

  }

  @Override
  public void createControl(Composite parent) {
    Composite composite = new Composite(parent, SWT.NONE);

    GridLayout gl = new GridLayout();
    composite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER,
        true, false));
    gl.numColumns = 2;
    gl.makeColumnsEqualWidth = true;
    composite.setLayout(gl);

    Label l = new Label(composite, 0);
    l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    ((GridData) l.getLayoutData()).horizontalSpan = 2;
    l
        .setText("Check the resource files and values below to select which strings will be sent for translation");

    createFileListTable(composite);

    TabFolder tabFolder = new TabFolder(composite, SWT.NONE);
    TabItem tabTranslateStringsItem = new TabItem(tabFolder, SWT.NULL);
    tabTranslateStringsItem.setText("Translate Strings");

    TabItem tabIgnoreStringsItem = new TabItem(tabFolder, SWT.NULL);
    tabIgnoreStringsItem.setText("Ignore Strings");

    Group translateGroup = createStringListTable(tabFolder,
        AndrolateApplication.STRINGLIST_TABLE_MODE_TRANSLATE);
    tabTranslateStringsItem.setControl(translateGroup);

    Group ignoreGroup = createStringListTable(tabFolder,
        AndrolateApplication.STRINGLIST_TABLE_MODE_IGNORE);
    tabIgnoreStringsItem.setControl(ignoreGroup);

    tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
    ((GridData) tabFolder.getLayoutData()).horizontalSpan = 2;

    setControl(composite);

    loadResources();
  }

  private void createFileListTable(final Composite composite) {
    Group fileListGroupBox = new Group(composite, SWT.SHADOW_ETCHED_IN);
    fileListGroupBox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    ((GridData) fileListGroupBox.getLayoutData()).horizontalSpan = 2;
    FillLayout rowLayout = new FillLayout();
    // rowLayout.spacing = 1;
    rowLayout.type = SWT.VERTICAL;
    // fileListGroupBox.setLayout(rowLayout);
    fileListGroupBox.setLayout(new GridLayout());
    fileListGroupBox.setText("Select Resource Files:");

    mSelectAllFilesButton = new Button(fileListGroupBox, SWT.CHECK);
    mSelectAllFilesButton.setText("Select / Deselect All");
    mSelectAllFilesButton.addListener(SWT.Selection, this);

    mFileList = new Table(fileListGroupBox, SWT.SINGLE | SWT.V_SCROLL
        | SWT.H_SCROLL | SWT.CHECK);

    mFileList.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    ((GridData) mFileList.getLayoutData()).horizontalSpan = 2;
    // mFileList.setLayout(new FillLayout(SWT.HORIZONTAL));
    mFileList.removeAll();
    mFileList.addListener(SWT.Selection, this);
    fileListGroupBox.pack();
  }

  private Group createStringListTable(final Composite composite,
      final int mode) {
    Group groupBox = new Group(composite, SWT.SHADOW_ETCHED_IN);
    groupBox.setLayoutData(new GridData(GridData.FILL_BOTH));
    ((GridData) groupBox.getLayoutData()).horizontalSpan = 1;
    FillLayout rowLayout = new FillLayout();
    // rowLayout.spacing = 1;
    rowLayout.type = SWT.VERTICAL;
    // fileListGroupBox.setLayout(rowLayout);
    groupBox.setLayout(new GridLayout());
    if (mode == AndrolateApplication.STRINGLIST_TABLE_MODE_TRANSLATE) {
      groupBox.setText("Select the strings to translate:");
      mSelectAllTranslateButton = new Button(groupBox, SWT.CHECK);
      mSelectAllTranslateButton.setText("Select / Deselect All");
      mSelectAllTranslateButton.addListener(SWT.Selection, this);
    } else {
      groupBox
          .setText("Select strings that you do NOT want to translate (ignored):");
      mSelectAllIgnoreButton = new Button(groupBox, SWT.CHECK);
      mSelectAllIgnoreButton.setText("Select / Deselect All");
      mSelectAllIgnoreButton.addListener(SWT.Selection, this);
    }

    Table table = new Table(groupBox, SWT.MULTI | SWT.V_SCROLL
        | SWT.H_SCROLL | SWT.CHECK);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    table.setLayoutData(new GridData(GridData.FILL_BOTH));
    ((GridData) table.getLayoutData()).heightHint = Math.round(getShell()
        .getSize().y / 4);
    ((GridData) table.getLayoutData()).horizontalSpan = 1;

    for (int i = 0; i < AndrolateApplication.STRINGLIST_TABLE_TITLES.length; i++) {
      TableColumn column = new TableColumn(table, SWT.NONE);
      column.setText(AndrolateApplication.STRINGLIST_TABLE_TITLES[i]);
    }
    table.addListener(SWT.Selection, this);
    if (mode == AndrolateApplication.STRINGLIST_TABLE_MODE_TRANSLATE) {
      mTranslateStringTable = table;
    } else {
      mIgnoreStringTable = table;
    }
    return groupBox;
  }

  @Override
  public void handleEvent(Event event) {
    if (event.widget == mSelectAllFilesButton) {
      getAndrolate().setOption(Androlate.OPTION_KEY_TRANSLATE_EVERYTHING,
          mSelectAllFilesButton.getSelection());
      for (TableItem ti : mFileList.getItems()) {
        ti.setChecked(mSelectAllFilesButton.getSelection());
      }
    }
    if (event.widget == mSelectAllTranslateButton) {
      for (TableItem ti : mTranslateStringTable.getItems()) {
        ti.setChecked(mSelectAllTranslateButton.getSelection());
      }
    }
    if (event.widget == mSelectAllIgnoreButton) {
      for (TableItem ti : mIgnoreStringTable.getItems()) {
        ti.setChecked(mSelectAllIgnoreButton.getSelection());
      }
    }
    if (event.widget == mTranslateStringTable
        || event.widget == mIgnoreStringTable) {
      if (event.detail != SWT.CHECK) {
        setPageComplete(validatePage());
        return;
      }
      if (!(event.item instanceof TableItem)) {
        setPageComplete(validatePage());
        return;
      }
      int mode = AndrolateApplication.STRINGLIST_TABLE_MODE_TRANSLATE;
      if (event.widget == mIgnoreStringTable)
        mode = AndrolateApplication.STRINGLIST_TABLE_MODE_IGNORE;

      TableItem tableItem = (TableItem) event.item;
      if (tableItem.getData() == null
          || !(tableItem.getData() instanceof StringData)) {
        setPageComplete(validatePage());
        return;
      }

      /* add or remove StringData to operation */
      StringData s = (StringData) tableItem.getData();
      ArrayList<StringData> sl = null;
      if (selectedOperation != null) {
        if (mode == AndrolateApplication.STRINGLIST_TABLE_MODE_TRANSLATE) {
          sl = selectedOperation.getTranslateList();
        } else if (mode == AndrolateApplication.STRINGLIST_TABLE_MODE_IGNORE) {
          sl = selectedOperation.getIgnoreList();
        }

        if (sl != null) {
          if (tableItem.getChecked()) {
            if (!sl.contains(s))
              sl.add(s);
            else if (sl.contains(s))
              sl.remove(s);
          } else {
            if (sl.contains(s))
              sl.remove(s);
          }
        }
      }
    }
    if (event.widget == mFileList) {
      if (!(event.item instanceof TableItem)) {
        setPageComplete(validatePage());
        return;
      }
      mSelectAllTranslateButton.setSelection(false);
      mSelectAllIgnoreButton.setSelection(false);
      TableItem tableItem = (TableItem) event.item;
      if (tableItem.getData() == null
          || !(tableItem.getData() instanceof AndrolateOperation)) {
        setPageComplete(validatePage());
        return;
      }

      AndrolateOperation operation = (AndrolateOperation) tableItem
          .getData();

      selectedOperation = operation;
      if (event.detail == SWT.CHECK) {
        setPageComplete(validatePage());
        return;
      }

      mTranslateStringTable.removeAll();
      mIgnoreStringTable.removeAll();
      ArrayList<StringData> allStringsList = (ArrayList<StringData>) operation
          .getAllStringsList();
      for (StringData s : allStringsList) {
        String name = s.getName();
        if (name == null || name.isEmpty())
          continue;

        TableItem newTranslateTableItem = new TableItem(
            mTranslateStringTable, SWT.NONE);
        newTranslateTableItem.setText(
            AndrolateApplication.STRINGLIST_TABLE_NAME_INDEX, name);
        newTranslateTableItem.setText(
            AndrolateApplication.STRINGLIST_TABLE_VALUE_INDEX, s
                .getValue());
        newTranslateTableItem.setData(s);

        TableItem newIgnoreTableItem = new TableItem(
            mIgnoreStringTable, SWT.NONE);
        newIgnoreTableItem.setText(
            AndrolateApplication.STRINGLIST_TABLE_NAME_INDEX, name);
        newIgnoreTableItem.setText(
            AndrolateApplication.STRINGLIST_TABLE_VALUE_INDEX, s
                .getValue());
        newIgnoreTableItem.setData(s);

        if (AndrolateApplication.containsName(selectedOperation
            .getTranslateList(), name)) {
          newTranslateTableItem.setChecked(true);
        }

        if (AndrolateApplication.containsName(selectedOperation
            .getIgnoreList(), name)) {
          newIgnoreTableItem.setChecked(true);
        }
      }
      for (TableColumn c : mTranslateStringTable.getColumns())
        c.pack();

      for (TableColumn c : mIgnoreStringTable.getColumns())
        c.pack();
    }

    setPageComplete(validatePage());
  }

  private void loadResources() {
    getAndrolateWizard().getAndrolateApplication();
    File[] resourceXmlfiles = FileFind.find(AndrolateApplication
        .getResValuesPath().toFile(),
        new ExtensionFilenameFilter("xml"), true);
    Androlate saved = null;
    try {
      getAndrolateApplication().createOperations(resourceXmlfiles);

      File configFile = getAndrolateWizard().getConfigFile();
      if (configFile.exists()) {
        try {
          saved = new Androlate();
          saved.loadFromFile(configFile);

          AndrolateApplication.mergeAndrolateObjects(saved,
              getAndrolate());
        } catch (Exception e) {
          Status status = new Status(IStatus.ERROR,
              Activator.PLUGIN_ID,
              AndrolateStatus.ERROR_IO_EXCEPTION,
              "Error loading saved settings", e.getCause());
          StatusManager.getManager().handle(status,
              StatusManager.BLOCK);
        }
      }
    } catch (ParserConfigurationException e) {
      Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
          AndrolateStatus.ERROR_PARSER_CONFIGURATION_EXCEPTION,
          "Error loading resources", e.getCause());
      StatusManager.getManager().handle(status, StatusManager.BLOCK);
    } catch (SAXException e) {
      Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
          AndrolateStatus.ERROR_SAX_EXCEPTION,
          "Error loading resources", e.getCause());
      StatusManager.getManager().handle(status, StatusManager.BLOCK);
    } catch (IOException e) {
      Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
          AndrolateStatus.ERROR_IO_EXCEPTION,
          "Error loading resources", e.getCause());
      StatusManager.getManager().handle(status, StatusManager.BLOCK);
    } catch (TransformerException e) {
      Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
          AndrolateStatus.ERROR_TRANSFORMER_EXCEPTION,
          "Error loading resources", e.getCause());
      StatusManager.getManager().handle(status, StatusManager.BLOCK);
    }

    bind(getAndrolate(), saved);
  }

  @Override
  public void onEnterPage() {
    // TODO Auto-generated method stub
    super.onEnterPage();
  }

  /*
   * Returns true when a resource and at least one string is selected for
   * translation
   */
  private boolean validatePage() {
    boolean result = false;

    Androlate a = getAndrolate();
    if (a == null)
      return false;

    for (TableItem ti : mFileList.getItems()) {
      AndrolateOperation op = (AndrolateOperation) ti.getData();
      if (op == null)
        continue;
      if (ti.getChecked()) {
        if (!AndrolateApplication.contains(a.getOperations(), op))
          a.getOperations().add(op);
      } else {
        if (AndrolateApplication.contains(a.getOperations(), op))
          a.getOperations().remove(op);
      }
    }

    for (TableItem ti : mFileList.getSelection()) {
      AndrolateOperation op = (AndrolateOperation) ti.getData();
      if (op == null)
        continue;
      if (ti.getChecked()) {
        if (!AndrolateApplication.contains(a.getOperations(), op))
          a.getOperations().add(op);
      } else {
        if (AndrolateApplication.contains(a.getOperations(), op))
          a.getOperations().remove(op);
      }
      for (TableItem tiTranslate : mTranslateStringTable.getItems()) {
        StringData s = (StringData) tiTranslate.getData();
        if (tiTranslate.getChecked()) {
          if (!AndrolateApplication.containsStringData(op
              .getTranslateList(), s)) {
            op.getTranslateList().add(s);
          }
        } else {
          if (AndrolateApplication.containsStringData(op
              .getTranslateList(), s)) {
            AndrolateApplication.removeStringData(op
                .getTranslateList(), s);
          }
        }
      }
      for (TableItem tiIgnore : mIgnoreStringTable.getItems()) {
        StringData s = (StringData) tiIgnore.getData();
        if (tiIgnore.getChecked()) {
          if (!AndrolateApplication.containsStringData(op
              .getIgnoreList(), s)) {
            op.getIgnoreList().add(s);
          }
        } else {
          AndrolateApplication
              .removeStringData(op.getIgnoreList(), s);
        }
      }
    }

    List<AndrolateOperation> operations = a.getOperations();
    if (operations == null || operations.size() == 0)
      return false;

    for (AndrolateOperation o : operations) {
      if (!(o.getTranslateList() == null || o.getTranslateList().size() == 0)) {
        result = true;
        break;
      }
    }

    return result;
  }
}
TOP

Related Classes of com.cicadalane.androlate.LoadResourceFilesPage

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.