Merge remote-tracking branch 'origin/tizen' into da-setting 55/27655/1
authorheeyoung <heeyoung1008.hwang@samsung.com>
Wed, 17 Sep 2014 08:03:14 +0000 (17:03 +0900)
committerheeyoung <heeyoung1008.hwang@samsung.com>
Wed, 17 Sep 2014 08:03:14 +0000 (17:03 +0900)
Conflicts:
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/communicator/Communicator22.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/listeners/AnalyzerPerspectiveListener.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/BinarySettingManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/InputRow.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallStackManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkDetailView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfileDataMaker.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/configuration/BinarySettingsPage.java

Change-Id: I9f68a203d96fe6c6951ee16c88f0085eb777dcec
Signed-off-by: heeyoung <heeyoung1008.hwang@samsung.com>
1  2 
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/common/AnalyzerManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/listeners/AnalyzerPerspectiveListener.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/communicator/Communicator30.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/BinarySettingManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/BinarySettingProcessor.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/manager/FileDataMaker.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkDetailView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/common/TimelineChartManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/ToolbarArea.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/configuration/BinarySettingsPage.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/SettingDialogBinarySettingsPage.java

@@@ -37,9 -37,8 +37,8 @@@ import org.tizen.dynamicanalyzer.commun
  import org.tizen.dynamicanalyzer.communicator.IDECommunicator;
  import org.tizen.dynamicanalyzer.swap.platform.BinarySettingManager;
  import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 -import org.tizen.dynamicanalyzer.ui.toolbar.configuration.ConfigurationDialogDataManager;
 +import org.tizen.dynamicanalyzer.ui.toolbar.setting.SettingDataManager;
  import org.tizen.dynamicanalyzer.util.Logger;
- import org.tizen.dynamicanalyzer.workbench.SingletonFocusManager;
  
  public class AnalyzerPerspectiveListener extends PerspectiveAdapter {
        private static boolean init = false;
  
                        IDECommunicator.startIDECommunicatorThread();
                        Logger.performance("TEST", "DA Start", "Start IDE Communicator");
- // TODO : check and remove
- //                    ConfigurationDialogDataManager.getInstance()
- //                                    .updateFeaturesValueFromConfigureManager();
 -                      ConfigurationDialogDataManager.getInstance().updateFeaturesValueFromConfigureManager();
++
 +                      SettingDataManager.getInstance();
-                       
                        ExecutionCallbackManager.registerCallback(
                                        ExecutionCallbackManager.WINDOWADVISOR_POSTWINDOWOPEN,
                                        new PostWindowOpenCallback());
  package org.tizen.dynamicanalyzer.swap.platform;
  
  import java.io.BufferedReader;
+ import java.io.BufferedWriter;
  import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileReader;
  import java.io.IOException;
- import java.io.InputStreamReader;
+ import java.nio.file.FileAlreadyExistsException;
  import java.util.ArrayList;
- import java.util.HashMap;
+ import java.util.Collections;
  import java.util.List;
- import java.util.regex.Pattern;
- import org.eclipse.swt.layout.FormAttachment;
- import org.eclipse.swt.layout.FormData;
+ import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
  import org.tizen.dynamicanalyzer.common.path.PathManager;
  import org.tizen.dynamicanalyzer.constant.CommonConstants;
- import org.tizen.dynamicanalyzer.project.BinaryInfo;
- import org.tizen.dynamicanalyzer.swap.platform.ui.InputRow;
 -import org.tizen.dynamicanalyzer.ui.toolbar.ConfigureManager;
 +import org.tizen.dynamicanalyzer.ui.toolbar.setting.SettingDataManager;
- import org.tizen.dynamicanalyzer.util.CommonUtil;
+ import org.tizen.dynamicanalyzer.util.FileUtil;
  import org.tizen.dynamicanalyzer.util.Logger;
- import org.tizen.dynamicanalyzer.utils.AnalyzerUtil;
  import org.tizen.dynamicanalyzer.utils.RpmUtil;
  
  public class BinarySettingManager {
        private static BinarySettingManager instance = null;
-       private HashMap<String, BinaryInfo> targetBinInfoMap = new HashMap<String, BinaryInfo>();
-       // temporary list
-       private HashMap<String, InputRow> inputRowHash = new HashMap<String, InputRow>();
-       private List<InputRow> inputRowList = new ArrayList<InputRow>();
-       private List<BinarySettingData> realBinarySettings = new ArrayList<BinarySettingData>();
+       private List<BinarySettingData> targetBinaryList = new ArrayList<BinarySettingData>();
+       // private Map<String, BinaryInfo> targetBinaryInfoMap = new HashMap<String,
+       // BinaryInfo>();
  
 -      private String debugRoot = PathManager.getRootstrapsPath(ConfigureManager.getPlatform());
 +      private String debugRoot = PathManager.getRootstrapsPath(SettingDataManager.getInstance()
 +                      .getPlatform());
  
        public static synchronized BinarySettingManager getInstance() {
                if (null == instance) {
@@@ -123,10 -123,10 +123,9 @@@ public class NetworkDetailView extends 
                        DATableDataFormat tableFormat = (DATableDataFormat) tableData[0].getData();
                        NetworkAPIType apiType = (NetworkAPIType) tableFormat.getLogData();
                        updateData(apiType.getSeq());
-               }else{
+               } else {
                        updateData(0);
                }
-               
 -
        }
  
        @Override
@@@ -126,30 -141,23 +141,23 @@@ public class BinarySettingsPage extend
                        String path = (String) result;
                        File saveFile = new File(path);
                        BufferedReader br = null;
-                       String content = null;
                        try {
-                               List<BinarySettingData> binarySettings = new ArrayList<BinarySettingData>();
                                br = new BufferedReader(new FileReader(saveFile));
-                               while (null != (content = br.readLine())) {
-                                       InputRow inputRow = new InputRow(inputComposite);
-                                       String[] splitContent = content
-                                                       .split(CommonConstants.COMMA);
-                                       inputRow.setBinaryText(new String(splitContent[0]));
-                                       inputRow.setDebugText(new String(splitContent[3]));
-                                       inputRow.setSourceText(new String(splitContent[4]));
+                               BinarySettingManager.getInstance().openData(br);
+                               List<BinarySettingData> binarySettings = BinarySettingManager.getInstance()
+                                               .getBinarySettingList();
+                               for (int i = 0; i < binarySettings.size(); i++) {
+                                       InputRow inputRow = new InputRow(inputComposite, removeButtonListener);
+                                       inputRow.setBinaryText(binarySettings.get(i).getBinaryPath());
+                                       inputRow.setDebugText(binarySettings.get(i).getDebugRpmPath());
+                                       inputRow.setSourceText(binarySettings.get(i).getUserSourceDir());
                                        inputRowList.add(inputRow);
-                                       inputRowHash.put(inputRow.getBinaryText(), inputRow);
-                                       BinarySettingData binaryData = new BinarySettingData();
-                                       binaryData.loadSaveData(content);
-                                       binarySettings.add(binaryData);
                                }
  
-                               BinarySettingManager.getInstance().putRealBinarySettingData(
-                                               binarySettings);
                                BinarySettingProgressManager.getInstance().startProcessStart(
                                                "now loading binaries...");
 -                              BinarySettingProcessor.runLoadingThread(me);
 +//                            BinarySettingProcessor.runLoadingThread(me);    // TODO : remove class
                        } catch (FileNotFoundException e) {
                                e.printStackTrace();
                        } catch (IOException e) {
        public BinarySettingsPage(Composite parent, int style) {
                super(parent, style);
                me = this;
-               setTitle("Binary Settings"); // TODO : remove class
-               rootPath = PathManager
-                               .getRootstrapsPath(ConfigureManager.getPlatform());
-               inputRowHash = BinarySettingManager.getInstance().getInputRowHash();
-               inputRowList = BinarySettingManager.getInstance().getInputRowList();
+               setTitle("Binary Settings"); // TODO nl
+               rootPath = PathManager.getRootstrapsPath(ConfigureManager.getPlatform());
+               inputRowList = new ArrayList<InputRow>();
 +
                String settingPath = PathManager.DA_SETTING_PATH;
                File settingFolder = new File(settingPath);
                if (!settingFolder.exists() || !settingFolder.isDirectory()) {
index e57ec5a,0000000..aa92949
mode 100644,000000..100644
--- /dev/null
@@@ -1,475 -1,0 +1,471 @@@
- import java.io.BufferedWriter;
 +/*
 + *  Dynamic Analyzer
 + *
 + * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
 + *
 + * Contact: 
 + * Jaewon Lim <jaewon81.lim@samsung.com>
 + * Jooyoul Lee <jy.exe.lee@samsung.com>
 + * Juyoung Kim <j0.kim@samsung.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.
 + * 
 + * Contributors:
 + * - S-Core Co., Ltd
 + * 
 + */
 +
 +package org.tizen.dynamicanalyzer.ui.toolbar.setting;
 +
 +import java.io.BufferedReader;
- import java.io.FileWriter;
 +import java.io.File;
 +import java.io.FileNotFoundException;
 +import java.io.FileReader;
- import java.util.HashMap;
 +import java.io.IOException;
 +import java.util.ArrayList;
-       private HashMap<String, InputRow> inputRowHash = null;
 +import java.util.List;
 +
 +import org.eclipse.swt.SWT;
 +import org.eclipse.swt.custom.ScrolledComposite;
 +import org.eclipse.swt.layout.FormAttachment;
 +import org.eclipse.swt.layout.FormData;
 +import org.eclipse.swt.layout.FormLayout;
 +import org.eclipse.swt.widgets.Composite;
 +import org.eclipse.swt.widgets.Event;
 +import org.eclipse.swt.widgets.Label;
 +import org.eclipse.swt.widgets.Listener;
 +import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
 +import org.tizen.dynamicanalyzer.common.path.PathManager;
 +import org.tizen.dynamicanalyzer.communicator.DACommunicator;
 +import org.tizen.dynamicanalyzer.constant.CommonConstants;
 +import org.tizen.dynamicanalyzer.resources.ColorResources;
 +import org.tizen.dynamicanalyzer.resources.FontResources;
 +import org.tizen.dynamicanalyzer.swap.platform.BinarySettingData;
 +import org.tizen.dynamicanalyzer.swap.platform.BinarySettingManager;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.BinarySettingProcessor;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.BinarySettingProgressManager;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.InputRow;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.LoadSettingDialog;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.SaveSettingDialog;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.DeviceExplorer.DeviceExplorerDilaog;
 +import org.tizen.dynamicanalyzer.swap.platform.ui.FileExplorer.FileExplorerDialog;
 +import org.tizen.dynamicanalyzer.util.CommonUtil;
 +import org.tizen.dynamicanalyzer.util.Logger;
 +import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
 +import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
 +import org.tizen.dynamicanalyzer.widgets.da.base.DAButton;
 +import org.tizen.dynamicanalyzer.widgets.da.base.WarningDialog;
 +import org.tizen.dynamicanalyzer.widgets.da.view.DAPageComposite;
 +
 +public class SettingDialogBinarySettingsPage extends DAPageComposite {
 +      public static final String ID = SettingDialogBinarySettingsPage.class.getName();
 +
 +      public static final int RADIO_CURRENT = 1;
 +      public static final int RADIO_ADD = 2;
 +      public static final int RADIO_REMOVE = 3;
 +
-                       LoadSettingDialog dialog = new LoadSettingDialog(button.getParent()
-                                       .getShell());
 +      private List<InputRow> inputRowList = null;
 +
 +      private ScrolledComposite scrolledComposite = null;
 +      private Composite inputComposite = null;
 +
 +      private DAButton clearButton = null;
 +      private DAButton addButton = null;
 +      private DAButton saveButton = null;
 +      private DAButton loadButton = null;
 +      private DAButton debugRootButton = null;
 +      private Label librariesLabel = null;
 +
 +      private String rootPath = null;
 +      private SettingDialogBinarySettingsPage me = null;
 +
 +      private DACustomButtonClickEventListener addButtonListener = new DACustomButtonClickEventListener() {
 +
 +              @Override
 +              public void handleClickEvent(DACustomButton button) {
 +                      DeviceExplorerDilaog dialog = new DeviceExplorerDilaog(getShell());
 +//                    dialog.setFilter(".so");
 +                      Object result = dialog.open();
 +                      if (result != null) {
 +                              BinarySettingProgressManager.getInstance().startProcessStart(
 +                                              "Wait for add binaries...");
 +                              BinarySettingProcessor.runAddThread(result, me);
 +                      }
 +              }
 +      };
 +
++      private DACustomButtonClickEventListener removeButtonListener = new DACustomButtonClickEventListener() {
++
++              @Override
++              public void handleClickEvent(DACustomButton button) {
++                      String binaryPath = ((InputRow) button.getParent()).getBinaryText();
++
++                      removeInputRow(binaryPath);
++                      Composite inputComposite = button.getParent().getParent();
++                      BinarySettingData rmData = BinarySettingManager.getInstance().getBinarySetting(
++                                      binaryPath);
++                      List<BinarySettingData> rmBinaries = new ArrayList<BinarySettingData>();
++                      rmBinaries.add(rmData);
++                      DACommunicator.sendSWAPMessage(AnalyzerConstants.MSG_SWAP_INST_REMOVE, rmBinaries);
++
++                      BinarySettingManager.getInstance().removeBinarySettingData(binaryPath);
++                      button.getParent().dispose();
++                      ((SettingDialogBinarySettingsPage) (inputComposite.getParent().getParent())).updateLayout();
++              }
++      };
++
 +      private DACustomButtonClickEventListener loadButtonListener = new DACustomButtonClickEventListener() {
 +
 +              @Override
 +              public void handleClickEvent(DACustomButton button) {
-                       String content = null;
++                      LoadSettingDialog dialog = new LoadSettingDialog(button.getParent().getShell());
 +                      Object result = dialog.open();
 +                      if (result == null) {
 +                              return;
 +                      }
 +
 +                      // swap remove message send and inputrow dispose
 +                      cleanButtonListener.handleClickEvent(null);
 +
 +                      String path = (String) result;
 +                      File saveFile = new File(path);
 +                      BufferedReader br = null;
-                               List<BinarySettingData> binarySettings = new ArrayList<BinarySettingData>();
 +                      try {
-                               while (null != (content = br.readLine())) {
-                                       InputRow inputRow = new InputRow(inputComposite);
-                                       String[] splitContent = content
-                                                       .split(CommonConstants.COMMA);
-                                       inputRow.setBinaryText(new String(splitContent[0]));
-                                       inputRow.setDebugText(new String(splitContent[3]));
-                                       inputRow.setSourceText(new String(splitContent[4]));
 +                              br = new BufferedReader(new FileReader(saveFile));
-                                       inputRowHash.put(inputRow.getBinaryText(), inputRow);
-                                       BinarySettingData binaryData = new BinarySettingData();
-                                       binaryData.loadSaveData(content);
-                                       binarySettings.add(binaryData);
++                              BinarySettingManager.getInstance().openData(br);
++                              List<BinarySettingData> binarySettings = BinarySettingManager.getInstance()
++                                              .getBinarySettingList();
++
++                              for (int i = 0; i < binarySettings.size(); i++) {
++                                      InputRow inputRow = new InputRow(inputComposite, removeButtonListener);
++                                      inputRow.setBinaryText(binarySettings.get(i).getBinaryPath());
++                                      inputRow.setDebugText(binarySettings.get(i).getDebugRpmPath());
++                                      inputRow.setSourceText(binarySettings.get(i).getUserSourceDir());
 +                                      inputRowList.add(inputRow);
-                               BinarySettingManager.getInstance().putRealBinarySettingData(
-                                               binarySettings);
 +                              }
 +
-                       SaveSettingDialog dialog = new SaveSettingDialog(button.getParent()
-                                       .getShell(), inputRowList);
 +                              BinarySettingProgressManager.getInstance().startProcessStart(
 +                                              "now loading binaries...");
 +                              BinarySettingProcessor.runLoadingThread(me);
 +                      } catch (FileNotFoundException e) {
 +                              e.printStackTrace();
 +                      } catch (IOException e) {
 +                              e.printStackTrace();
 +                      } finally {
 +                              CommonUtil.tryClose(br);
 +                      }
 +              }
 +      };
 +
 +      private DACustomButtonClickEventListener debugRootButtonListener = new DACustomButtonClickEventListener() {
 +
 +              @Override
 +              public void handleClickEvent(DACustomButton button) {
 +                      FileExplorerDialog dialog = new FileExplorerDialog(getShell());
 +                      dialog.getExplorer().setRoot(CommonUtil.getHomeDirectory());
 +                      Object result = dialog.open();
 +                      if (result != null) {
 +                              @SuppressWarnings("unchecked")
 +                              List<File> files = (List<File>) result;
 +                              if (!files.isEmpty()) {
 +                                      File file = files.get(0);
 +                                      if (!file.isDirectory()) {
 +                                              file = file.getParentFile();
 +                                      }
 +                                      rootPath = file.getAbsolutePath();
 +                              }
 +
 +                              if (null != rootPath) {
 +                                      BinarySettingProgressManager.getInstance()
 +                                                      .startProcessStart("Wait for update debug path");
 +                                      BinarySettingProcessor.runUpdateDebugRoot(me);
 +                                      BinarySettingManager.getInstance().setDebugRoot(rootPath);
 +                              }
 +                      }
 +              }
 +      };
++
 +      private DACustomButtonClickEventListener saveButtonListener = new DACustomButtonClickEventListener() {
 +
 +              @Override
 +              public void handleClickEvent(DACustomButton button) {
-                       List<BinarySettingData> binaries = BinarySettingManager
-                                       .getInstance().getRealBinarySettings();
++                      SaveSettingDialog dialog = new SaveSettingDialog(button.getParent().getShell(),
++                                      inputRowList);
 +                      dialog.open();
 +              }
 +      };
 +
 +      private DACustomButtonClickEventListener cleanButtonListener = new DACustomButtonClickEventListener() {
 +
 +              @Override
 +              public void handleClickEvent(DACustomButton button) {
 +                      if (null != button) {
 +                              WarningDialog dialog = new WarningDialog(getShell(), SWT.NONE);
 +                              dialog.setMessage("Clear binary settings?\nIf you click 'Ok', All settings will be deleted");
 +                              boolean result = dialog.open();
 +                              if (!result) {
 +                                      return;
 +                              }
 +                      }
-                               DACommunicator.sendSWAPMessage(
-                                               AnalyzerConstants.MSG_SWAP_INST_REMOVE, binaries);
++                      List<BinarySettingData> binaries = BinarySettingManager.getInstance()
++                                      .getBinarySettingList();
 +                      if (!binaries.isEmpty()) {
-                                       BinarySettingManager.getInstance()
-                                                       .removeRealBinarySettingData(
-                                                                       inputRowList.get(i).getBinaryText());
++                              DACommunicator.sendSWAPMessage(AnalyzerConstants.MSG_SWAP_INST_REMOVE, binaries);
 +
 +                              for (int i = 0; i < inputRowList.size(); i++) {
-                               inputRowHash.clear();
++                                      BinarySettingManager.getInstance().removeBinarySettingData(
++                                                      inputRowList.get(i).getBinaryText());
 +                                      inputRowList.get(i).dispose();
 +                              }
 +                              inputRowList.clear();
-               inputRowHash.clear();
 +                      }
 +
 +                      updateLayout();
 +              }
 +      };
 +
 +      private void clearLayout() {
 +              for (int i = 0; i < inputRowList.size(); i++) {
 +                      inputRowList.get(i).dispose();
 +              }
 +              inputRowList.clear();
-               rootPath = PathManager
-                               .getRootstrapsPath(SettingDataManager.getInstance().getPlatform());
-               inputRowHash = BinarySettingManager.getInstance().getInputRowHash();
-               inputRowList = BinarySettingManager.getInstance().getInputRowList();
 +      }
 +
 +      public SettingDialogBinarySettingsPage(Composite parent, int style) {
 +              super(parent, style);
 +              me = this;
 +              setTitle("Binary Settings"); // TODO nl
-               int libCount = BinarySettingManager.getInstance()
-                               .getRealBinarySettings().size();
++              rootPath = PathManager.getRootstrapsPath(SettingDataManager.getInstance().getPlatform());
++              inputRowList = new ArrayList<InputRow>();
++
 +
 +              String settingPath = PathManager.DA_SETTING_PATH;
 +              File settingFolder = new File(settingPath);
 +              if (!settingFolder.exists() || !settingFolder.isDirectory()) {
 +                      if (!settingFolder.mkdirs()) {
 +                              Logger.debug("setting directory create failed...");
 +                      }
 +              }
 +
 +              this.setLayout(new FormLayout());
 +              this.setBackground(ColorResources.DIALOG_BG_UPPER);
 +
-               scrolledComposite = new ScrolledComposite(this, SWT.BORDER
-                               | SWT.V_SCROLL | SWT.H_SCROLL);
++              int libCount = BinarySettingManager.getInstance().getBinarySettingList().size();
 +              librariesLabel = new Label(this, SWT.TRANSPARENT);
 +              FormData data = new FormData();
 +              data.top = new FormAttachment(0, 15);
 +              data.left = new FormAttachment(0, 16);
 +              data.height = 16;
 +              data.width = 100;
 +              librariesLabel.setLayoutData(data);
 +              librariesLabel.setText("Libraies (" + libCount + ")");
 +              librariesLabel.setBackground(ColorResources.DIALOG_BG_UPPER);
 +              librariesLabel.setFont(FontResources.getDADefaultFont());
 +
-               scrolledComposite
-                               .setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR);
++              scrolledComposite = new ScrolledComposite(this, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
 +              data = new FormData();
 +              data.top = new FormAttachment(librariesLabel, 4);
 +              data.left = new FormAttachment(0, 6);
 +              data.right = new FormAttachment(100, -6);
 +              data.height = 310;
 +              // data.width = 590;
 +              scrolledComposite.setLayoutData(data);
 +              scrolledComposite.setLayout(new FormLayout());
 +              scrolledComposite.setExpandHorizontal(true);
 +              scrolledComposite.setExpandVertical(true);
-               scrolledComposite.setMinSize(inputComposite.computeSize(SWT.DEFAULT,
-                               SWT.DEFAULT));
++              scrolledComposite.setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR);
 +
 +              inputComposite = new Composite(scrolledComposite, SWT.NONE);
 +              scrolledComposite.setContent(inputComposite);
-               inputComposite
-                               .setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR);
++              scrolledComposite.setMinSize(inputComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
 +              scrolledComposite.setShowFocusedControl(true);
 +              data = new FormData();
 +              data.top = new FormAttachment(0, 5);
 +              data.left = new FormAttachment(0, 0);
 +              data.right = new FormAttachment(100, 0);
 +              data.bottom = new FormAttachment(100, -5);
 +              inputComposite.setLayoutData(data);
 +              inputComposite.setLayout(new FormLayout());
-               inputRowList.clear();
-               inputRowHash.clear();
++              inputComposite.setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR);
 +
 +              loadButton = new DAButton(this, SWT.NONE);
 +              data = new FormData();
 +              data.top = new FormAttachment(scrolledComposite, 17);
 +              data.left = new FormAttachment(0, 6);
 +              data.height = 22;
 +              data.width = 78;
 +              loadButton.setLayoutData(data);
 +              loadButton.setText("Load");
 +              loadButton.addClickListener(loadButtonListener);
 +
 +              saveButton = new DAButton(this, SWT.NONE);
 +              data = new FormData();
 +              data.top = new FormAttachment(scrolledComposite, 17);
 +              data.left = new FormAttachment(loadButton, 6);
 +              data.height = 22;
 +              data.width = 78;
 +              saveButton.setLayoutData(data);
 +              saveButton.setText("Save");
 +              saveButton.addClickListener(saveButtonListener);
 +
 +              debugRootButton = new DAButton(this, SWT.NONE);
 +              data = new FormData();
 +              data.top = new FormAttachment(scrolledComposite, 17);
 +              data.left = new FormAttachment(saveButton, 32);
 +              data.height = 22;
 +              data.width = 112;
 +              debugRootButton.setLayoutData(data);
 +              debugRootButton.setText("Set DebugRoot");
 +              debugRootButton.addClickListener(debugRootButtonListener);
 +
 +              clearButton = new DAButton(this, SWT.NONE);
 +              data = new FormData();
 +              data.top = new FormAttachment(scrolledComposite, 17);
 +              data.right = new FormAttachment(100, -6);
 +              data.height = 22;
 +              data.width = 78;
 +              clearButton.setLayoutData(data);
 +              clearButton.setText("Clear");
 +              clearButton.addClickListener(cleanButtonListener);
 +
 +              addButton = new DAButton(this, SWT.NONE);
 +              data = new FormData();
 +              data.top = new FormAttachment(scrolledComposite, 17);
 +              data.right = new FormAttachment(clearButton, -6);
 +              data.height = 22;
 +              data.width = 78;
 +              addButton.setLayoutData(data);
 +              addButton.setText("Add");
 +              addButton.addClickListener(addButtonListener);
 +
-                       BinarySettingData binData = BinarySettingManager.getInstance()
-                                       .getRealBinarySetting(binary);
 +              this.addListener(SWT.Show, new Listener() {
 +
 +                      @Override
 +                      public void handleEvent(Event event) {
 +                              initInputRows();
 +                      }
 +              });
 +
 +              this.addListener(SWT.Dispose, new Listener() {
 +
 +                      @Override
 +                      public void handleEvent(Event event) {
 +                      }
 +              });
 +      }
 +
 +      public void doApply() {
 +              // dirty check and update path
 +              for (InputRow inputRow : inputRowList) {
 +                      String binary = inputRow.getBinaryText();
 +                      String debug = inputRow.getDebugText();
 +                      String source = inputRow.getSourceText();
-                               binData.setUserSourcePath(source);
++                      BinarySettingData binData = BinarySettingManager.getInstance().getBinarySetting(binary);
 +                      if (binData != null) {
 +                              binData.setDebugRpmPath(debug);
-               String targetPath = PathManager.DA_BINARY_AUTO_SAVE_FILE;
-               File saveFile = new File(targetPath);
-               FileWriter fileWriter = null;
-               BufferedWriter bufWriter = null;
-               List<BinarySettingData> saveData = BinarySettingManager.getInstance()
-                               .getRealBinarySettings();
-               boolean success = false;
-               try {
-                       fileWriter = new FileWriter(saveFile);
-                       bufWriter = new BufferedWriter(fileWriter);
-                       for (int i = 0; i < saveData.size(); i++) {
-                               bufWriter.write(saveData.get(i).getSaveData());
-                               bufWriter.newLine();
-                       }
-                       success = true;
-               } catch (IOException e) {
-                       e.printStackTrace();
-               } finally {
-                       CommonUtil.tryClose(bufWriter, fileWriter);
-               }
-               if (success) {
-                       // add snapshot model update
-                       Logger.debug("binary settings auto save success!!"); //$NON-NLS-1$
-               } else {
-                       Logger.debug("binary settings auto save fail..."); //$NON-NLS-1$
-               }
++                              binData.setUserSourceDir(source);
 +                      } else {
 +                              Logger.debug("binary data is null");
 +                      }
 +              }
 +
 +              Logger.debug("update complete!");
 +      }
 +
 +      public void doClose() {
-               binData = BinarySettingManager.getInstance().getRealBinarySettings();
 +      }
 +
 +      public void initInputRows() {
 +              List<BinarySettingData> binData = null;
-                       InputRow inputRow = new InputRow(inputComposite);
++              binData = BinarySettingManager.getInstance().getBinarySettingList();
 +              clearLayout();
 +              for (int i = 0; i < binData.size(); i++) {
-                       String source = binData.get(i).getUserSourcePath();
++                      InputRow inputRow = new InputRow(inputComposite, removeButtonListener);
 +                      inputRow.setBinaryText(binData.get(i).getBinaryPath());
 +                      // String debug = binData.get(i).getDebugFilePath();
 +                      String debug = binData.get(i).getDebugRpmPath();
 +                      if (null != debug && !debug.isEmpty()) {
 +                              inputRow.setDebugText(debug);
 +                      } else {
 +                              inputRow.setDebugText(CommonConstants.EMPTY);
 +                      }
 +
-                               source = binData.get(i).getDebugSourcePath();
++                      String source = binData.get(i).getUserSourceDir();
 +                      if (null != source && !source.isEmpty()) {
 +                              inputRow.setSourceText(source);
 +                      } else {
-                       inputRowHash.put(binData.get(i).getBinaryPath(), inputRow);
++                              source = binData.get(i).getRpmSourceDir();
 +                              if (null != source && !source.isEmpty()) {
 +                                      inputRow.setSourceText(source);
 +                              } else {
 +                                      inputRow.setSourceText(CommonConstants.EMPTY);
 +                              }
 +                      }
-               int count = BinarySettingManager.getInstance().getRealBinarySettings()
-                               .size();
 +                      inputRowList.add(inputRow);
 +              }
 +              updateLayout();
 +      }
 +
++      private void removeInputRow(String path) {
++              InputRow prev = null;
++              InputRow cur = null;
++              InputRow next = null;
++
++              for (int i = 0; i < inputRowList.size(); i++) {
++                      // define prev, cur, next inputRow
++                      if (i != 0) {
++                              prev = cur;
++                      }
++                      cur = inputRowList.get(i);
++                      if (i != inputRowList.size() - 1) {
++                              next = inputRowList.get(i + 1);
++                      } else {
++                              next = null;
++                      }
++
++                      if (cur.getBinaryText().equals(path)) {
++                              // modify layout of next input row
++                              if (next != null) {
++                                      FormData nextData = (FormData) next.getLayoutData();
++                                      if (prev != null) {
++                                              nextData.top = new FormAttachment(prev, 2);
++                                      } else {
++                                              nextData.top = new FormAttachment(0, 0);
++                                      }
++                              }
++
++                              // remove from row list
++                              inputRowList.remove(i);
++                              break;
++                      }
++              }
++      }
++
 +      public void updateLayout() {
-               scrolledComposite.setMinSize(inputComposite.computeSize(SWT.DEFAULT,
-                               SWT.DEFAULT));
++              int count = BinarySettingManager.getInstance().getBinarySettingList().size();
 +              librariesLabel.setText("Libraries (" + count + ")");
 +              inputComposite.layout();
++              scrolledComposite.setMinSize(inputComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
 +              if (count == 0) {
 +                      saveButton.setButtonEnabled(false);
 +                      clearButton.setButtonEnabled(false);
 +              } else {
 +                      saveButton.setButtonEnabled(true);
 +                      clearButton.setButtonEnabled(true);
 +              }
 +      }
 +
 +      public String getDebugRootPath() {
 +              return rootPath;
 +      }
 +}