From 82913d53b800e27cd1b927793011d64108c62a6a Mon Sep 17 00:00:00 2001 From: HyungKyu Song Date: Sat, 16 Feb 2013 00:58:47 +0900 Subject: [PATCH] Tizen 2.0 Release --- AUTHORS | 2 + LICENSE.APLv2 | 202 +++++ NOTICE | 4 +- org.tizen.nativeplatform.feature/feature.xml | 10 +- .../tools/snippets/Comments/File Comment.xml | 13 + .../tools/snippets/Comments/Project Comment.xml | 13 + .../resources/tools/snippets/keyCombos.properties | 10 + org.tizen.nativeplatform/META-INF/MANIFEST.MF | 29 +- .../OSGI-INF/l10n/bundle.properties | 9 + org.tizen.nativeplatform/build.properties | 4 +- org.tizen.nativeplatform/icons/rootstrap/add.gif | Bin 0 -> 117 bytes .../icons/rootstrap/breakpoint.gif | Bin 0 -> 111 bytes .../icons/rootstrap/delete.gif | Bin 0 -> 112 bytes org.tizen.nativeplatform/icons/rootstrap/edit.gif | Bin 0 -> 148 bytes .../icons/rootstrap/filesyst.gif | Bin 0 -> 310 bytes .../icons/rootstrap/import.gif | Bin 0 -> 164 bytes .../icons/rootstrap/refresh.gif | Bin 0 -> 177 bytes .../icons/rootstrap/remove.gif | Bin 0 -> 97 bytes .../icons/rootstrap/server.gif | Bin 0 -> 150 bytes .../icons/rootstrap/successed.png | Bin 0 -> 933 bytes org.tizen.nativeplatform/plugin.xml | 752 ++++++++-------- org.tizen.nativeplatform/plugin_customization.ini | 67 ++ .../src/org/tizen/nativeplatform/Activator.java | 79 +- .../build/PlatformBuildCommandLauncher.java | 101 +++ .../build/PlatformBuildPackageObjectAction.java | 159 ++++ .../build/PlatformCheckCancelJob.java | 110 +++ .../build/PlatformConfigurationEnvVarSupplier.java | 53 +- .../build/PlatformConfigurationManager.java | 384 ++++---- .../build/PlatformMakeGenerator.java | 94 +- .../build/PlatformProjectConverter.java | 63 +- .../build/PlatformProjectDependentBuilder.java | 123 ++- .../build/PlatformProjectDependentPackager.java | 211 +++-- .../build/PlatformProjectPackaging.java | 85 ++ .../build/ui/GBSBuildConfigurationTab.java | 461 ++++++++++ .../org/tizen/nativeplatform/gbs/GBSOption.java | 68 ++ .../tizen/nativeplatform/gbs/GBSOptionManager.java | 137 +++ .../tizen/nativeplatform/git/CachedGitEntries.java | 44 + .../nativeplatform/git/FileGitIndexParser.java | 66 ++ .../org/tizen/nativeplatform/git/GitCommander.java | 301 +++++++ .../git/GitCommanderMessages.properties | 0 .../tizen/nativeplatform/git/GitDescManager.java | 63 ++ .../nativeplatform/git/GitIndexParserFactory.java | 44 + .../tizen/nativeplatform/git/IGitIndexParser.java | 37 + .../nativeplatform/git/WebGitIndexParser.java | 128 +++ .../nativeplatform/git/model/GitConfiguration.java | 52 ++ .../nativeplatform/git/model/GitDescription.java | 62 ++ .../launch/ITizenLaunchConfigurationConstants.java | 47 + .../launch/PlatformCommandFactory.java | 41 + .../launch/PlatformMIProcessAdapter.java | 189 ++++ .../launch/TizenDebianLaunchDelegate.java | 367 ++++++-- .../launch/TizenDebianLaunchDelegateForAttach.java | 271 +++--- .../launch/TizenDebianLaunchDelegateForCore.java | 81 +- .../launch/TizenDebianLaunchMessages.java | 60 +- .../launch/TizenDebianLaunchMessages.properties | 47 +- .../launch/ui/LaunchTabUIMessages.properties | 25 + ...DebianLaunchConfigurationForAttachTabGroup.java | 53 +- ...enDebianLaunchConfigurationForCoreTabGroup.java | 53 +- .../ui/TizenDebianLaunchConfigurationTabGroup.java | 53 +- .../launch/ui/TizenDebianMainAttachTab.java | 471 ++++++++++ .../launch/ui/TizenDebianMainCoreTab.java | 53 +- .../launch/ui/TizenDebianMainTab.java | 653 ++++++++++++-- .../TizenDebianProjectAttachLaunchShortcut.java | 223 +++-- .../TizenDebianProjectCoredumpLaunchShortcut.java | 61 +- .../shortcut/TizenDebianProjectLaunchShortcut.java | 263 ++++-- .../ui/shortcut/TizenDebianPropertyTester.java | 127 +-- .../launch/ui/shortcut/TizenPathInputDialog.java | 53 +- .../pages/LaunchWizardPageUIMessages.properties | 25 + .../wizard/pages/PlatformLaunchSettingAppPage.java | 579 +++++++++++++ .../wizard/pages/PlatformLaunchSettingBinPage.java | 141 +++ .../pages/PlatformLaunchSettingProcPage.java | 300 +++++++ .../wizards/LaunchWizardUIMessages.properties | 4 + .../launch/wizards/PlatformAttachLaunchWizard.java | 140 +++ .../launch/wizards/PlatformLaunchUtils.java | 594 +++++++++++++ .../launch/wizards/PlatformLaunchWizard.java | 255 ++++++ .../launch/wizards/PlatformLaunchWizardDialog.java | 116 +++ .../launch/wizards/ShowLogDialog.java | 110 +++ .../launch/wizards/ShowPackageStatusDialog.java | 326 +++++++ .../password/PasswdDialogMessage.properties | 3 + .../password/PasswordInputDialog.java | 174 ++++ .../nativeplatform/password/SudoPasswdManager.java | 63 ++ .../pkgmgr/DialogActionDelegate.java | 123 +++ .../pkgmgr/PackageManagerHandler.java | 125 +++ .../pkgmgr/PackageManagerOuputReceiver.java | 91 ++ .../nativeplatform/pkgmgr/RPMPackageCommander.java | 915 +++++++++++++++++++ .../pkgmgr/RPMPackageCommands.properties | 26 + .../pkgmgr/model/InstalledPackage.java | 35 + .../pkgmgr/model/InstalledPkgProvider.java | 57 ++ .../nativeplatform/pkgmgr/model/LocalPackage.java | 58 ++ .../pkgmgr/model/LocalPkgProvider.java | 49 ++ .../tizen/nativeplatform/pkgmgr/model/Package.java | 140 +++ .../pkgmgr/model/PackageProvider.java | 93 ++ .../nativeplatform/pkgmgr/model/RemotePackage.java | 58 ++ .../pkgmgr/model/RemotePkgProvider.java | 57 ++ .../nativeplatform/pkgmgr/model/Repository.java | 84 ++ .../pkgmgr/model/RepositoryProvider.java | 60 ++ .../pkgmgr/ui/AddRemotePackageDialog.java | 303 +++++++ .../nativeplatform/pkgmgr/ui/AddRepoDialog.java | 114 +++ .../nativeplatform/pkgmgr/ui/BuildSystemTab.java | 353 ++++++++ .../tizen/nativeplatform/pkgmgr/ui/CommonTab.java | 606 +++++++++++++ .../tizen/nativeplatform/pkgmgr/ui/DeviceTab.java | 319 +++++++ .../nativeplatform/pkgmgr/ui/ModifyRepoDialog.java | 145 ++++ .../pkgmgr/ui/PackageTableSelectionAdapter.java | 127 +++ .../pkgmgr/ui/PkgMgrUIMessages.properties | 81 ++ .../nativeplatform/pkgmgr/ui/RPMPackageDialog.java | 244 ++++++ .../pkgmgr/ui/RemoveInstalledPackageDialog.java | 455 ++++++++++ .../pkgmgr/ui/RepoTableSelectionAdapter.java | 86 ++ .../preferences/PreferencesManager.java | 638 ++++++++++++++ .../preferences/ui/GitConfUIMessages.properties | 45 + .../preferences/ui/PasswdConfDialog.java | 102 +++ .../preferences/ui/PlatformPreferencePage.java | 121 +++ .../preferences/ui/PlatformUIMessages.properties | 6 + .../preferences/ui/SiteConfigurationDialog.java | 434 +++++++++ .../ui/SiteConfigurationPreferencePage.java | 413 +++++++++ .../rootstrap/IRootstrapChangedListener.java | 33 + .../nativeplatform/rootstrap/RootstrapManager.java | 746 ++++++++++++++++ .../rootstrap/SnapshotURLParser.java | 178 ++++ .../templateengine/TizenTemplateProcess.java | 111 +++ .../process/SetDefaultBuildOptions.java | 94 ++ .../tizen/nativeplatform/util/CommandLauncher.java | 437 ++++++++++ .../nativeplatform/views/model/Architecture.java | 86 ++ .../nativeplatform/views/model/ICheckTreeItem.java | 40 + .../views/model/PlatformRootstrap.java | 115 +++ .../tizen/nativeplatform/views/model/Snapshot.java | 73 ++ .../views/provider/RootstrapContentProvider.java | 61 ++ .../views/provider/RootstrapLabelProvider.java | 51 ++ .../views/ui/AddRootstrapDialog.java | 426 +++++++++ .../views/ui/RootstrapUIMessages.properties | 60 ++ .../nativeplatform/views/ui/RootstrapView.java | 965 +++++++++++++++++++++ .../views/ui/SelectRootstrapMappingDialog.java | 183 ++++ .../wizards/TemplateTizenPlatformNewWizard.java | 164 ++++ .../wizards/TizenDebianMainWizardPage.java | 59 +- .../wizards/TizenDebianProjectWizard.java | 68 +- .../wizards/TizenPlatformMainWizardPage.java | 321 +++++++ .../wizards/TizenPlatformProjectWizard.java | 170 ++++ .../wizards/WizardUIMessages.properties | 10 + .../wizards/model/TizenPlatformTemplateModel.java | 45 + .../tizen/nativeplatform/wizards/ui/Messages.java | 46 + .../wizards/ui/TizenPlatformPWComposite.java | 513 +++++++++++ .../nativeplatform/wizards/ui/messages.properties | 1 + .../EmptyProject/template.properties | 4 +- .../HelloWorldProject/template.xml | 186 ++-- .../EmptyProject/template.properties | 4 +- .../HelloWorldProject/debian/changelog | 6 +- .../HelloWorldProject/debian/control | 14 +- .../HelloWorldProject/debian/rules | 22 +- .../HelloWorldProject/packaging/hello.spec | 34 + .../HelloWorldProject/template.xml | 191 ++-- .../PlatformProject/.buildproperties.xml | 1 + .../PlatformProject/template.properties | 19 + .../PlatformProject/template.xml | 74 ++ package/build.linux | 312 +------ package/changelog | 96 ++ package/pkginfo.manifest | 26 +- 153 files changed, 20580 insertions(+), 2089 deletions(-) create mode 100644 LICENSE.APLv2 create mode 100644 org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/Comments/File Comment.xml create mode 100644 org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/Comments/Project Comment.xml create mode 100644 org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/keyCombos.properties create mode 100644 org.tizen.nativeplatform/OSGI-INF/l10n/bundle.properties create mode 100644 org.tizen.nativeplatform/icons/rootstrap/add.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/breakpoint.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/delete.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/edit.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/filesyst.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/import.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/refresh.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/remove.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/server.gif create mode 100644 org.tizen.nativeplatform/icons/rootstrap/successed.png create mode 100644 org.tizen.nativeplatform/plugin_customization.ini create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildCommandLauncher.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildPackageObjectAction.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformCheckCancelJob.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectPackaging.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/ui/GBSBuildConfigurationTab.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOption.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOptionManager.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/CachedGitEntries.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/FileGitIndexParser.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommander.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommanderMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitDescManager.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitIndexParserFactory.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/IGitIndexParser.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/WebGitIndexParser.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitConfiguration.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitDescription.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ITizenLaunchConfigurationConstants.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformCommandFactory.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformMIProcessAdapter.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/LaunchTabUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainAttachTab.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/LaunchWizardPageUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingAppPage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingBinPage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingProcPage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/LaunchWizardUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformAttachLaunchWizard.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchUtils.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizard.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizardDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowLogDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowPackageStatusDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswdDialogMessage.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswordInputDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/SudoPasswdManager.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/DialogActionDelegate.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerHandler.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerOuputReceiver.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommander.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommands.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPackage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPkgProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPackage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPkgProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Package.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/PackageProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePackage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePkgProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Repository.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RepositoryProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRemotePackageDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRepoDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/BuildSystemTab.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/CommonTab.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/DeviceTab.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/ModifyRepoDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PackageTableSelectionAdapter.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PkgMgrUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RPMPackageDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RemoveInstalledPackageDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RepoTableSelectionAdapter.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/PreferencesManager.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/GitConfUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PasswdConfDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformPreferencePage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationPreferencePage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/IRootstrapChangedListener.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/RootstrapManager.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/SnapshotURLParser.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/TizenTemplateProcess.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/process/SetDefaultBuildOptions.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/util/CommandLauncher.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Architecture.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/ICheckTreeItem.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/PlatformRootstrap.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Snapshot.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapContentProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapLabelProvider.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/AddRootstrapDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapView.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/SelectRootstrapMappingDialog.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TemplateTizenPlatformNewWizard.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformMainWizardPage.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformProjectWizard.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/WizardUIMessages.properties create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/model/TizenPlatformTemplateModel.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/Messages.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/TizenPlatformPWComposite.java create mode 100644 org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/messages.properties create mode 100644 org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/packaging/hello.spec create mode 100644 org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/.buildproperties.xml create mode 100644 org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.properties create mode 100644 org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.xml create mode 100644 package/changelog diff --git a/AUTHORS b/AUTHORS index acaf5c7..d932f3b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,4 +1,6 @@ Kangho Kim +Donghee Yang +Donghyuk Yang Namkoong Ho YoonKi Park Taeyoung Son diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/NOTICE b/NOTICE index 4297ee3..901a81c 100644 --- a/NOTICE +++ b/NOTICE @@ -1 +1,3 @@ -Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. +Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE.APLv2 file for Apache License terms and conditions. diff --git a/org.tizen.nativeplatform.feature/feature.xml b/org.tizen.nativeplatform.feature/feature.xml index ef8f9fc..1c2ed1a 100644 --- a/org.tizen.nativeplatform.feature/feature.xml +++ b/org.tizen.nativeplatform.feature/feature.xml @@ -2,8 +2,8 @@ @@ -12,13 +12,17 @@ - Copyright (C) 2010 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + Copyright (c) [Enter License Description here.] + + + +File Comment +describe file information + + + \ No newline at end of file diff --git a/org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/Comments/Project Comment.xml b/org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/Comments/Project Comment.xml new file mode 100644 index 0000000..c0175f1 --- /dev/null +++ b/org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/Comments/Project Comment.xml @@ -0,0 +1,13 @@ + + +Project Comment +describe project information + + + \ No newline at end of file diff --git a/org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/keyCombos.properties b/org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/keyCombos.properties new file mode 100644 index 0000000..212a7f8 --- /dev/null +++ b/org.tizen.nativeplatform.feature/rootfiles/resources/tools/snippets/keyCombos.properties @@ -0,0 +1,10 @@ +#These key combos are used by the cfeclipse plugin. +#Tue Jul 26 16:12:05 KST 2011 +fc=/Comments/File Comment.xml +lim=/Log/Log INFO message.xml +clm=/Localization/Create a localized message.xml +lwm=/Log/Log WARNING message.xml +lem=/Log/Log ERROR message.xml +lvm=/Log/Log VERBOSE message.xml +pc=/Comments/Project Comment.xml +ldm=/Log/Log DEBUG message.xml diff --git a/org.tizen.nativeplatform/META-INF/MANIFEST.MF b/org.tizen.nativeplatform/META-INF/MANIFEST.MF index a6686e1..b532ef7 100644 --- a/org.tizen.nativeplatform/META-INF/MANIFEST.MF +++ b/org.tizen.nativeplatform/META-INF/MANIFEST.MF @@ -1,38 +1,57 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 -Bundle-Name: Tizen Native Inhouse +Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.tizen.nativeplatform;singleton:=true Bundle-Version: 1.0.0 Bundle-Activator: org.tizen.nativeplatform.Activator -Bundle-Vendor: Samsung +Bundle-Vendor: %Bundle-Vendor Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.cdt.managedbuilder.core;bundle-version="7.0.2", org.eclipse.core.resources;bundle-version="3.6.1", org.eclipse.cdt.core;bundle-version="5.2.1", org.eclipse.cdt.managedbuilder.ui;bundle-version="7.0.0", - org.tizen.common;bundle-version="1.3.20", + org.tizen.common, org.eclipse.ui.console;bundle-version="3.5.0", org.eclipse.cdt.ui;bundle-version="5.2.2", org.eclipse.debug.ui, org.tizen.common.connection, - org.tizen.nativecommon;bundle-version="1.0.0" + org.tizen.nativecommon Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Import-Package: org.eclipse.cdt.debug.core, org.eclipse.cdt.debug.core.cdi, org.eclipse.cdt.debug.core.cdi.model, + org.eclipse.cdt.debug.core.sourcelookup, + org.eclipse.cdt.debug.internal.core.sourcelookup, org.eclipse.cdt.debug.internal.ui.launch, org.eclipse.cdt.debug.mi.core, + org.eclipse.cdt.debug.mi.core.cdi, + org.eclipse.cdt.debug.mi.core.command.factories, org.eclipse.cdt.debug.ui, org.eclipse.cdt.launch, org.eclipse.cdt.launch.internal.ui, org.eclipse.cdt.launch.ui, org.eclipse.core.expressions, + org.eclipse.core.net.proxy, org.eclipse.debug.core, org.eclipse.debug.core.model, org.eclipse.debug.ui, org.eclipse.debug.ui.sourcelookup, + org.eclipse.egit.core;version="0.12.1", + org.eclipse.egit.core.op;version="0.12.1", + org.eclipse.egit.ui.internal.sharing;version="0.12.1", + org.eclipse.jgit.lib;version="0.12.1", + org.eclipse.jgit.storage.file;version="0.12.1", + org.eclipse.jgit.transport;version="0.12.1", + org.eclipse.jgit.util;version="0.12.1", org.eclipse.ui, org.eclipse.ui.dialogs, - org.tizen.common.connection + org.mihalis.opal.preferenceWindow, + org.mihalis.opal.preferenceWindow.widgets, + org.tizen.common.connection, + org.tizen.nativeappcommon, + org.tizen.nativeappcommon.templateengine, + org.tizen.nativeappcommon.wizards, + org.tizen.nativeappcommon.wizards.model, + org.tizen.sdblib diff --git a/org.tizen.nativeplatform/OSGI-INF/l10n/bundle.properties b/org.tizen.nativeplatform/OSGI-INF/l10n/bundle.properties new file mode 100644 index 0000000..1dba912 --- /dev/null +++ b/org.tizen.nativeplatform/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,9 @@ +Bundle-Vendor = The Linux Foundation +Bundle-Name = Tizen Platform Development Tools + +org.tizen.nativeplatform.gitconfig.label=Site Configuration +org.tizen.nativeplatform.proxyconfig.label=HTTP Proxy +org.tizen.nativeplatform.password.label=Password +org.tizen.nativeplatform.page.name=Platform + +view.rootstrap = Rootstrap View diff --git a/org.tizen.nativeplatform/build.properties b/org.tizen.nativeplatform/build.properties index 3b87492..86d1871 100644 --- a/org.tizen.nativeplatform/build.properties +++ b/org.tizen.nativeplatform/build.properties @@ -3,8 +3,10 @@ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ .,\ + plugin_customization.ini,\ icons/,\ templates/,\ plugin.properties,\ about.html,\ - about_files/ + about_files/,\ + OSGI-INF/ diff --git a/org.tizen.nativeplatform/icons/rootstrap/add.gif b/org.tizen.nativeplatform/icons/rootstrap/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ccf050b0e78cc81659175d94813c5bd7c941c5f GIT binary patch literal 117 zcmZ?wbhEHb6krfwSj50!Zy#?tYj5q|efIJ7%T9f;uiqaP8}yZ&lN$l}cIkzp!m|7hkPOoBU UX`IKb5n{%3q`RcbgMq;s0DU+qn@7vq&x3~WfMF0OQ{$yblVPI#_VE_V< zS_Wp*id}d98SG;?v`SdQh9z&-!%`+ji-ilO9qnAV=5;`}^u(=aCb&5MF$>6fz}?iu Opxm`^vc-H(25SIPpeUpO literal 0 HcmV?d00001 diff --git a/org.tizen.nativeplatform/icons/rootstrap/edit.gif b/org.tizen.nativeplatform/icons/rootstrap/edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7404109ba07de909648e7d2c63b1ac3691b983b GIT binary patch literal 148 zcmZ?wbhEHb6krfw*vtR|GiT0hXlO`FOS89+|G&Tf{`~m;_4fDo&)+}4{{Q{?_3`!# z7A*Py|36qQgW^vXRuKkX1|1L=WCjC^ykUf}3d$dDz$#HzH=SaI4}(@?NeB3%}s%zRpx3q<>Df3;^ z=DVfM_sd_oXx)M9kKaz+bzi0P$v~ zrKRnkZ-0MZ9FU{{-F0U+sPIh?Nu14E%g-Jv*_~q|*s!6ZXM&8Ka4W;# P0GVs^w>t+SyoS@Y-DgBbQengIzY z{$yblVPI#_0f~XkU|@;+aKck~uX$w8+h>zqc}_M2oJf*!Shy#@NUlTCCpVFyP3gKh zmjZ)@PL$E?C(IgLVvN2Cg_j?wFfl6yGU)Kl^A_6}`i70=LyC^(VUfGdiH6zy6|EK= O?svGm>%yxA8LR<~%RRvW literal 0 HcmV?d00001 diff --git a/org.tizen.nativeplatform/icons/rootstrap/remove.gif b/org.tizen.nativeplatform/icons/rootstrap/remove.gif new file mode 100644 index 0000000000000000000000000000000000000000..73f5554133e1315f31b2ca538182b9898009f3f7 GIT binary patch literal 97 zcmZ?wbhEHb6krfwSj50!Zy#?tYj5q|efIJ7QL$0~|NmzI1I3>#tRf7o3_2hlNG$`i vTEwn9{|rufN=sU#UuyfIz){i|Fz?w39>>?aUO6$8#1@CHdtY;2g~1vCl`_vNb}pXtewtud!0u@i eKM8;BQ+QrMb9 z(q@oQv;uKKCkDeRvOppbgJh0bJ}jBZ5)-3K=7*8Z4`xf2`AIa(o^zh(ocBHN%eAz$fa5suJgGUKKB%rD)*jL2b$Rs|tSS-8S+S=NSi;K&X$)vU*iXyyTudBPe`he-%q3jtJTV`Qq$br?6BMI9ml+#m=Ih@=kdtRGeB?9Bf5SGL^!~$WSPRSS-*@+VMds3v+XG=(zbcB60-xV=fdHZn7~gGtkR& z46eiz?PIR7C6EhE%n;&0 zrLF=#->jQynZZ9!=e6F3{05lf1&}g0>~MdoiER&SfK6*+N#;tumKhbg^WqAg-JJs53TjrW(Qf<#C(AqGbYAJBmbgKMHW&_vlN|Z; z#JbGP%-rnkY`fLEb?4Ee-!@iN?JD_SqhVs=@0qTypKnb~J-I{0HKHiWYnonW1_Gfc z3@lQ50X@ZELQP|&|Be6Yqf{e7y7J8G>gpm3iU<*lZv+?s3J;!e|I%#300000NkvXX Hu0mjfdm6m_ literal 0 HcmV?d00001 diff --git a/org.tizen.nativeplatform/plugin.xml b/org.tizen.nativeplatform/plugin.xml index 643c46c..dd361e0 100644 --- a/org.tizen.nativeplatform/plugin.xml +++ b/org.tizen.nativeplatform/plugin.xml @@ -1,91 +1,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + - + - + superClass="org.tizen.nativeide.toolchain.sbi.gnu.base"> + name="Tizen Platform Builder"> + id="org.tizen.nativeide.tool.sbi.gnu.archiver.platform.base" + superClass="org.tizen.nativeide.tool.sbi.gnu.archiver.base"> + id="org.tizen.nativeide.tool.sbi.gnu.cpp.compiler.platform.base" + superClass="org.tizen.nativeide.tool.sbi.gnu.cpp.compiler.base"> + + id="org.tizen.nativeide.tool.sbi.gnu.c.compiler.platform.base" + superClass="org.tizen.nativeide.tool.sbi.gnu.c.compiler.base"> + id="org.tizen.nativeide.tool.sbi.gnu.c.linker.platform.base" + superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"> + id="org.tizen.nativeide.tool.sbi.gnu.cpp.linker.platform.base" + superClass="org.tizen.nativeide.tool.sbi.gnu.cpp.linker.base"> + id="org.tizen.nativeapp.tool.sbi.gnu.assembler.platform.base" + superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base"> @@ -329,28 +163,28 @@ + id="org.tizen.nativeide.toolchain.sbi.gcc45.platform.emulator" + superClass="org.tizen.nativeide.toolchain.sbi.gcc45.platform.base"> + id="org.tizen.nativeide.toolchain.sbi.gcc45.platform.device" + superClass="org.tizen.nativeide.toolchain.sbi.gcc45.platform.base"> @@ -359,8 +193,8 @@ @@ -369,11 +203,11 @@ point="org.eclipse.cdt.managedbuilder.core.projectConverter"> + name="Upgrade Tizen Platform Project, GCC-4.5" + toId="org.tizen.nativebuild.target.sbi.gcc45.platform"> @@ -383,47 +217,45 @@ point="org.eclipse.ui.newWizards"> - - - - - + point="org.eclipse.cdt.ui.CDTWizard"> + + + + - + @@ -460,21 +292,22 @@ delegate="org.tizen.nativeplatform.launch.TizenDebianLaunchDelegateForAttach" id="org.tizen.nativeplatform.launch.TizenDebianLaunchDelegateForAttach" modes="debug" - name="Tizen Custom Debian Project - Attach" - delegateDescription="The Tizen Custom Debian Project Launcher supports attach debugging Tizen process on device" + name="Tizen Platform Project - Attach" + delegateDescription="The Tizen Platform Project Launcher supports attach debugging Tizen process on device" sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator" sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer" type="org.tizen.nativeplatform.launch.TizenDebianLaunchConfigurationTypeForAttach"/> - + + name="Tizen Platform Project Main Tab" + class="org.tizen.nativeplatform.launch.ui.TizenDebianMainAttachTab"> + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + description="Runs a Tizen Platform Project"/> + description="Debugs a Tizen Platform Project"/> - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + description="Attach Debugs a Tizen Platform Project"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.tizen.nativeplatform/plugin_customization.ini b/org.tizen.nativeplatform/plugin_customization.ini new file mode 100644 index 0000000..9e6b5ea --- /dev/null +++ b/org.tizen.nativeplatform/plugin_customization.ini @@ -0,0 +1,67 @@ +#org.eclipse.ui.ide/SAVE_ALL_BEFORE_BUILD=true +#org.eclipse.core.resources/refresh.enabled=true +#org.eclipse.core.resources/description.autobuilding=true +org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = true +org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false +org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight +org.eclipse.ui/defaultPerspectiveId=org.tizen.nativeplatform.perspective + +org.eclipse.ui.workbench/SHOW_BUILDID_ON_STARTUP=true + +# CDT related preferences +org.eclipse.cdt.ui/lineNumberRuler=true +org.eclipse.cdt.ui/useQuickDiffPrefPage=true +org.eclipse.cdt.ui/useAnnotationsPrefPage=true +org.eclipse.cdt.ui/spelling_locale_initialized=true +org.eclipse.cdt.ui/c_keyword_bold=false +org.eclipse.cdt.ui/c_type=48,87,69 +org.eclipse.cdt.ui/semanticHighlighting.functionDeclaration.color=34,34,139 +org.eclipse.cdt.ui/semanticHighlighting.label.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.externalSDK.color=46,46,75 +org.eclipse.cdt.ui/c_string=47,44,64 +org.eclipse.cdt.ui/semanticHighlighting.staticMethod.color=40,72,32 +org.eclipse.cdt.ui/c_single_line_comment=39,39,194 +org.eclipse.cdt.ui/semanticHighlighting.macroSubstitution.color=34,55,18 +org.eclipse.cdt.ui/c_type_bold=false +org.eclipse.cdt.ui/semanticHighlighting.method.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.enumerator.italic=false +org.eclipse.cdt.ui/semanticHighlighting.globalVariable.italic=false +org.eclipse.cdt.ui/semanticHighlighting.localVariableDeclaration.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.namespace.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.globalVariable.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.macroDefinition.color=43,43,89 +org.eclipse.cdt.ui/semanticHighlighting.enumerator.color=160,32,240 +org.eclipse.cdt.ui/properties.manage.config.disable=true +org.eclipse.cdt.ui/semanticHighlighting.macroSubstitution.enabled=true +org.eclipse.cdt.ui/c_keyword=130,21,21 +org.eclipse.cdt.ui/semanticHighlighting.function.color=43,43,89 +org.eclipse.cdt.ui/c_multi_line_comment=39,39,194 +org.eclipse.cdt.ui/semanticHighlighting.function.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.method.color=22,22,73 +org.eclipse.cdt.ui/semanticHighlighting.methodDeclaration.color=22,22,73 +org.eclipse.cdt.ui/pp_directive_bold=false +org.eclipse.cdt.ui/semanticHighlighting.localVariableDeclaration.color=65,65,107 +org.eclipse.cdt.ui/semanticHighlighting.externalSDK.bold=false +org.eclipse.cdt.ui/semanticHighlighting.macroDefinition.enabled=true +org.eclipse.cdt.ui/semanticHighlighting.staticMethod.italic=false +org.eclipse.cdt.ui/pp_directive=26,106,30 +org.eclipse.cdt.ui/eclipse.preferences.version=1 +org.eclipse.cdt.ui/editor_folding_enabled=true +org.eclipse.cdt.ui/sourceHoverBackgroundColor.SystemDefault=false +org.eclipse.cdt.ui/sourceHoverBackgroundColor=245,245,181 + +# Help Browsing +org.eclipse.help.base/always_external_browser=false + +# Proxy Settings +org.eclipse.core.net/systemProxiesEnabled=false +org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true +org.eclipse.core.net/nonProxiedHosts=localhost|127.0.0.1|192.168.129.* + +# Default text file encoding +#org.eclipse.core.resources/encoding=UTF-8 + +# Tizen Keybinding +# org.eclipse.ui/KEY_CONFIGURATION_ID=org.eclipse.ui.slpAcceleratorConfiguration + + diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/Activator.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/Activator.java index 27866a9..141d262 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/Activator.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/Activator.java @@ -1,41 +1,41 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import org.tizen.nativecommon.build.ProjectTypeManager; -import org.tizen.nativeplatform.build.CustomDebianProjectDependentBuilderOld; import org.tizen.nativeplatform.build.PlatformConfigurationManager; import org.tizen.nativeplatform.build.PlatformProjectDependentBuilder; import org.tizen.nativeplatform.build.PlatformProjectDependentPackager; +import org.tizen.nativeplatform.preferences.PreferencesManager; /** @@ -44,10 +44,11 @@ import org.tizen.nativeplatform.build.PlatformProjectDependentPackager; public class Activator extends AbstractUIPlugin { // The plug-in ID - public static final String PLUGIN_ID = "org.tizen.nativeplatform"; //$NON-NLS-1$ + public static final String PLUGIN_ID = "org.tizen.nativeplatform"; //$NON-NLS-1$ // The shared instance private static Activator plugin; + private IPreferenceStore prefStore; /** * The constructor @@ -61,22 +62,15 @@ public class Activator extends AbstractUIPlugin { */ public void start(BundleContext context) throws Exception { super.start(context); - plugin = this; - - ProjectTypeManager.registerProjectArtifactType( - PlatformConfigurationManager.OLD_SLP_CUSTOM_DEBIAN_ARTIFACT_TYPE, - CustomDebianProjectDependentBuilderOld.getInstance(), - PlatformProjectDependentPackager.getInstance(), - false); + plugin = this; ProjectTypeManager.registerProjectArtifactType( - PlatformConfigurationManager.TIZEN_CUSTOM_DEBIAN_ARTIFACT_TYPE, + PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE, PlatformProjectDependentBuilder.getInstance(), PlatformProjectDependentPackager.getInstance(), true); - //SLPProjectTypeManager.registerBuilder("SLP Custom Debian Package", CustomDebianProjectDependentBuilder.getInstance() ); - //SLPProjectTypeManager.registerBuilder("SLP Inhouse Framework Package", InhouseFrameworkProjectDependentBuilder.getInstance() ); + PreferencesManager.setDefaultValues(); } /* @@ -107,5 +101,12 @@ public class Activator extends AbstractUIPlugin { public static ImageDescriptor getImageDescriptor(String path) { return imageDescriptorFromPlugin(PLUGIN_ID, path); } + + /** + * @return the name of this plugin + */ + public static String getPluginId() { + return getDefault().getBundle().getSymbolicName(); + } } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildCommandLauncher.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildCommandLauncher.java new file mode 100644 index 0000000..24b7166 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildCommandLauncher.java @@ -0,0 +1,101 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; + +import org.eclipse.cdt.core.CommandLauncher; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; + +import org.tizen.common.util.ProcessMonitorThread; +import org.tizen.nativecommon.build.CommonProjectDependentBuilder; +import org.tizen.nativecommon.build.ProjectTypeManager; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; + + +public class PlatformBuildCommandLauncher extends CommandLauncher { + @Override + public Process execute(IPath commandPath, String[] args, String[] env, + IPath changeToDirectory, IProgressMonitor monitor) throws CoreException { + + Process proc = null; + + if ( commandPath.toString().contains( "sbi-make") ) { + IProject proj = getProject(); + CommonProjectDependentBuilder builder = ProjectTypeManager.getProjectBuilderInstance(proj); + SmartBuildInterface sbi = SmartBuildInterface.getInstance(proj); + + String targetID = builder.getTargetID(); + String toolchainID = sbi.getToolchainIDFromTargetID(targetID); + String rootstrapID = sbi.getRootstrapIDFromTargetID(targetID); + + try { + if (!sbi.checkRootstrapID(rootstrapID) || !sbi.checkToolchainID(toolchainID)) { + String message = String.format( + "Current build system does not support '%s' toolchain or '%s' rootstrap\n" + + "Please select toolchain supported by current build system.", + toolchainID, rootstrapID); + + throw new SBIException(message); + } + if (!sbi.checkTargetID(targetID)) { + sbi.writeTargetCfgFile(targetID); + } + } catch (SBIException e) { + e.printStackTrace(); + e.showErrorDialog(); + } + + String options = args[0]; + for( int i = 1 ; i < args.length ; i++ ) { + options = options + " " + args[i]; + } + String cmd = String.format( "%s action %s -- make -options=\"%s\"", sbi.getSBICommandPath("sbi"), targetID, options ); + + // command parsing using SBI + String[] cmds = sbi.parseCommandString( cmd ); + String[] newArgs = new String[ cmds.length - 1]; + for( int i = 0; i < cmds.length - 1; i ++ ) { + newArgs[i]= cmds[i+1]; + } + proc = super.execute( new Path(cmds[0]), newArgs, sbi.getEnvironmentVariables(), changeToDirectory, monitor); + } else { + proc = super.execute(commandPath, args, env, changeToDirectory, monitor); + } + + ProcessMonitorThread pmt = new ProcessMonitorThread(proc, monitor); + pmt.start(); + + return proc; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildPackageObjectAction.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildPackageObjectAction.java new file mode 100644 index 0000000..1779274 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformBuildPackageObjectAction.java @@ -0,0 +1,159 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; + +import java.io.File; +import java.io.FilenameFilter; +import java.lang.reflect.InvocationTargetException; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.ui.IObjectActionDelegate; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; +import org.eclipse.ui.PlatformUI; + +import org.tizen.nativecommon.build.CommonBuildMessages; +import org.tizen.nativecommon.build.CommonBuildPackageFile; + +public class PlatformBuildPackageObjectAction implements IWorkbenchWindowActionDelegate, IObjectActionDelegate { + protected IProject project; + protected IWorkbenchWindow window; + private boolean packagingResult = false; + private final String PKGTYPE = "RPM"; + + public PlatformBuildPackageObjectAction() { + } + + public PlatformBuildPackageObjectAction(IProject project) { + this.project = project; + } + + @Override + public void run(IAction action) { + + CommonBuildPackageFile.setPackageType(project, PKGTYPE); + window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + ProgressMonitorDialog dialog = new ProgressMonitorDialog(window.getShell()); + + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + IConfiguration config = ManagedBuildManager.getBuildInfo( project ).getDefaultConfiguration(); + packagingResult = PlatformProjectPackaging.RPMPackaging(project, config, monitor); + } + }); + } catch (InvocationTargetException e1) { + e1.printStackTrace(); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + + if (packagingResult) { + MessageDialog.openInformation(window.getShell(), CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.SUCCESS_TO_BUILD_PACKAGE); + } else { + MessageDialog.openError(window.getShell(), CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.FAIL_TO_BUILD_PACKAGE); + } + + // refresh the project explorer + try { + project.refreshLocal(IResource.DEPTH_INFINITE, null ); + } catch (CoreException e) { + e.printStackTrace(); + } + } + + protected File findFirstFilebyExtension(File searchPath, String ext) { + File[] allFiles = searchPath.listFiles(new ExtFilter(ext)); + if (allFiles == null || allFiles.length == 0) + return null; + return allFiles[0]; + } + + protected class ExtFilter implements FilenameFilter { + protected String ext; + + public ExtFilter(String ext) { + this.ext = ext; + } + + public boolean accept(File dir, String name) { + return name.endsWith(ext); + } + } + + @Override + public void selectionChanged(IAction action, ISelection selection) { + Object obj = null; + + if (selection instanceof TreeSelection) { + TreeSelection _selection = (TreeSelection)selection; + + if (_selection != null) { + obj = _selection.getFirstElement(); + } + } + + if (obj != null) { + if (obj instanceof IProject) { + project = (IProject) obj; + } + } + } + + @Override + public void setActivePart(IAction action, IWorkbenchPart targetPart) { + // do nothing + } + + @Override + public void dispose() { + // do nothing + } + + @Override + public void init(IWorkbenchWindow window) { + // do nothing + } +} + diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformCheckCancelJob.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformCheckCancelJob.java new file mode 100644 index 0000000..608ebe0 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformCheckCancelJob.java @@ -0,0 +1,110 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; + +import java.lang.reflect.Field; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IProgressMonitor; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.password.SudoPasswdManager; + + +public class PlatformCheckCancelJob implements Runnable { + private IProgressMonitor monitor; + private String targetId; + private SmartBuildInterface target_sbi; + private SmartBuildInterface command_sbi; + private boolean terminateChecker; + private boolean isFinished; + private Process proc; + + public PlatformCheckCancelJob(IProgressMonitor _monitor, IProject proj, SmartBuildInterface target_sbi) { + this.target_sbi = target_sbi; + this.command_sbi = SmartBuildInterface.getInstance(proj); + this.monitor = _monitor; + this.proc = null; + IConfiguration cfg = ManagedBuildManager.getBuildInfo(proj).getDefaultConfiguration(); + this.targetId = PlatformConfigurationManager.getBuildTargetName(cfg); + } + + @Override + public void run() { + this.terminateChecker = false; + this.isFinished = false; + + try { + while(!isFinished) { + Thread.sleep(100); + if (monitor.isCanceled()) { + try { + proc = target_sbi.getProcess(); + + String passwd = SudoPasswdManager.getSudoPassword(); + if (passwd == null) { + passwd = ""; + } + String pid = ""; + try { + Field f = proc.getClass().getDeclaredField("pid"); + f.setAccessible(true); + pid = f.get(proc).toString(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + + String option = String.format("-pid=%s -passwd=%s", pid, passwd); + command_sbi.actionReturnExitValue("kill", option, targetId, null); + + proc.destroy(); + + } catch (SBIException e) { + setFinishFlag(true); + e.printStackTrace(); + } + setFinishFlag(true); + } + } + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } + + public void setFinishFlag(boolean value) { + this.isFinished = value; + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationEnvVarSupplier.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationEnvVarSupplier.java index eaf3639..b43775d 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationEnvVarSupplier.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationEnvVarSupplier.java @@ -1,31 +1,30 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; import java.util.ArrayList; diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationManager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationManager.java index 66360c7..aafdd51 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationManager.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformConfigurationManager.java @@ -1,50 +1,42 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; import java.util.ArrayList; import org.eclipse.cdt.core.CCProjectNature; -import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.core.IFileInfo; -import org.eclipse.cdt.managedbuilder.core.IFolderInfo; -import org.eclipse.cdt.managedbuilder.core.IResourceInfo; +import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.ITool; -import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.internal.core.ToolChain; -import org.eclipse.cdt.managedbuilder.tcmodification.IFolderInfoModification; -import org.eclipse.cdt.managedbuilder.tcmodification.IToolChainModificationManager; -import org.eclipse.cdt.managedbuilder.tcmodification.IToolListModification; -import org.eclipse.cdt.managedbuilder.ui.properties.ManagedBuilderUIPlugin; +import org.eclipse.cdt.managedbuilder.internal.core.MultiConfiguration; +import org.eclipse.cdt.managedbuilder.internal.core.Tool; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.tizen.nativecommon.build.CommonConfigurationManager; @@ -52,51 +44,36 @@ import org.tizen.nativecommon.build.SmartBuildInterface; import org.tizen.nativecommon.build.exception.SBIException; - - @SuppressWarnings("restriction") public class PlatformConfigurationManager extends CommonConfigurationManager { // ProjectInfo public static final String CURRENT_SLP_PROJECT_VERSION = "1.0.0"; - public static final String TIZEN_CUSTOM_DEBIAN_ARTIFACT_TYPE = "com.samsung.slp.nativeide.buildArtefactType.cdeb"; + public static final String TIZEN_PLATFORM_ARTIFACT_TYPE = "org.tizen.nativeide.buildArtefactType.platform"; public static final String OLD_SLP_CUSTOM_DEBIAN_ARTIFACT_TYPE = "com.samsung.slp.project.custom.debian"; - // SBI Compatibility - public static final String SBI_PROJECT_TYPE_ID = "com.samsung.slp.nativebuild.target.sbi.gcc45sbox2.cdeb"; - public static final String SBI_DEFAULT_I386_CONFIGRATION_ID = "com.samsung.slp.nativeide.config.sbi.gcc45sbox2.cdeb.emulator"; - public static final String SBI_DEFAULT_ARM_CONFIGRATION_ID = "com.samsung.slp.nativeide.config.sbi.gcc45sbox2.cdeb.device"; - public static final String SBI_DEFAULT_TARGET_NAME = "tizen-device-1.0.sb2_gcc45sbox2.armel.cdeb"; - public static final String SBI_ARM_TOOLCHAIN_NAME = "gcc45sbox2.armel.cdeb"; - public static final String SBI_ARM_SBOX2_TOOLCHAIN_NAME = "gcc45sbox2.armel.cdeb"; - public static final String SBI_ARM_ROOTSTRAP_NAME = "tizen-device-1.0.sb2"; - public static final String SBI_I386_TOOLCHAIN_NAME = "gcc45sbox2.i386.cdeb"; - public static final String SBI_I386_SBOX2_TOOLCHAIN_NAME = "gcc45sbox2.i386.cdeb"; - public static final String SBI_I386_ROOTSTRAP_NAME = "tizen-emulator-1.0.sb2"; - + // SBI Compatibility + public static final String SBI_PROJECT_TYPE_ID = "org.tizen.nativebuild.target.sbi.gcc45.platform"; + public static final String SBI_DEFAULT_I386_CONFIGRATION_ID = "org.tizen.nativeide.config.sbi.gcc45.platform.emulator"; + public static final String SBI_DEFAULT_ARM_CONFIGRATION_ID = "org.tizen.nativeide.config.sbi.gcc45.platform.device"; + + static final String SBI_PLATFORM_CPP_COMPILER_TOOL_ID = "org.tizen.nativeide.tool.sbi.gnu.cpp.compiler.platform.base"; + static final String SBI_PLATFORM_CPP_COMPILER_GBS_OPTION_ID = "sbi.gnu.cpp.compiler.option.gbs.platform"; + // get compiler flags public static String getAllCFlags( IConfiguration config ) { - // TODO: should be removed - if ( isOldConfiguration(config) ) { - return CustomDebianConfigurationOld.getAllCFlags(config); - } - - return getAllCompilerFlags( config, SBI_BASE_C_COMPILER_TOOL_ID ); - } - + String c_compiler_id = SBI_BASE_C_COMPILER_TOOL_ID; + return getAllCompilerFlags( config, c_compiler_id ); + } public static String getAllCPPFlags( IConfiguration config ) { - // TODO: should be removed - if ( isOldConfiguration(config) ) { - return CustomDebianConfigurationOld.getAllCPPFlags(config); - } - - return getAllCompilerFlags( config, SBI_BASE_CPP_COMPILER_TOOL_ID ); - } - - + String cpp_compiler_id = SBI_BASE_CPP_COMPILER_TOOL_ID; + return getAllCompilerFlags( config, cpp_compiler_id ); + } + + @SuppressWarnings("deprecation") protected static String getAllCompilerFlags( IConfiguration config, String compilerId ) { ITool compilerTool = config.getToolsBySuperClassId(compilerId)[0]; @@ -124,178 +101,177 @@ public class PlatformConfigurationManager extends CommonConfigurationManager compilerFlags = compilerFlags.trim(); return compilerFlags; - } - - - - - protected static boolean isCPPProject( IConfiguration config ) - { - try { - IProject project = (IProject)config.getOwner(); - - if ( project.hasNature( CCProjectNature.CC_NATURE_ID ) ) - return true; - } catch (CoreException e1) { - e1.printStackTrace(); - } - - return false; } - - - public static void changeToolchain( IConfiguration config, ICResourceDescription cfgd, String toolchainNameInCfg) { - // TODO: should be removed - if ( isOldConfiguration(config) ) { - CustomDebianConfigurationOld.changeToolchain(config, cfgd, toolchainNameInCfg ); + public static void setGBSOptions( IConfiguration config, Tool tool, ArrayList optionList ) + { + String tool_id = tool.getBaseId(); + String option_id = ""; + + if (tool_id.contains(SBI_PLATFORM_CPP_COMPILER_TOOL_ID)) { + option_id = SBI_PLATFORM_CPP_COMPILER_GBS_OPTION_ID; + } else { return; } - - IToolChainModificationManager tcmmgr = ManagedBuildManager.getToolChainModificationManager(); - IToolChain[] r_tcs = ManagedBuildManager.getRealToolChains(); - IToolChain[] v_tcs; - IResourceInfo ri = config.getResourceInfo(cfgd.getPath(), false); - IToolListModification mod; - - if (ri instanceof IFolderInfo) { - mod = tcmmgr.createModification((IFolderInfo)ri); + ITool cpp_linkerTool =config.getToolsBySuperClassId(tool_id)[0]; + IOption dynamicAnalysisOption = cpp_linkerTool.getOptionBySuperClassId(option_id); + ManagedBuildManager.setOption( config, cpp_linkerTool, dynamicAnalysisOption, optionList.toArray( new String[0] )); + } + + public static void setGBSOptions( IConfiguration config, ArrayList optionList ) { + if (config instanceof MultiConfiguration) { + Object o[] = ((MultiConfiguration) config).getItems(); + for (IConfiguration c : (IConfiguration[])o) { + internalSetGBSOptions(c, optionList); + } } else { - mod = tcmmgr.createModification((IFileInfo)ri); - } - - IToolChain realToolChain = null; - if (ri instanceof IFolderInfo) { - IToolChain toolChainInstance = ((IFolderInfoModification)mod).getToolChain(); - realToolChain = ManagedBuildManager.getRealToolChain(toolChainInstance); - if (realToolChain==null) - realToolChain = toolChainInstance; + internalSetGBSOptions(config, optionList); } - - boolean isMng = config.getBuilder().isManagedBuildOn(); - ArrayList list = new ArrayList(); - - IToolChain[] tcs = r_tcs; - IFolderInfoModification fim = (IFolderInfoModification)mod; - tcs = fim.getCompatibleToolChains(); - IToolChain[] tcs1 = new IToolChain[tcs.length + 1]; - System.arraycopy(tcs, 0, tcs1, 0, tcs.length); - tcs1[tcs.length] = realToolChain; // add existing toolchain - tcs = tcs1; + } + + private static void internalSetGBSOptions( IConfiguration config, ArrayList optionList ) + { + String cpp_compiler_id = SBI_PLATFORM_CPP_COMPILER_TOOL_ID; + String option_id = SBI_PLATFORM_CPP_COMPILER_GBS_OPTION_ID; - for (IToolChain tc : tcs) { - if ( tc.isSystemObject() && !(((ToolChain)tc).isPreferenceToolChain() && !isMng) ) { - // NO TOOLCHAIN - continue; + // cpp compiler + ITool tool =config.getToolsBySuperClassId(cpp_compiler_id)[0]; + IOption gbsOption = tool.getOptionBySuperClassId(option_id); + ManagedBuildManager.setOption( config, tool, gbsOption, optionList.toArray( new String[0] )); + } + + public static void addGBSOptions(IConfiguration config, String newOption) + { + if (config instanceof MultiConfiguration) { + Object o[] = ((MultiConfiguration) config).getItems(); + for (IConfiguration c : (IConfiguration[])o) { + internalAddGBSOption(c, newOption); } - list.add(tc); + } else { + internalAddGBSOption(config, newOption); } - - v_tcs = list.toArray(new IToolChain[list.size()]); - int x = 0; - IFolderInfoModification foim = (IFolderInfoModification)mod; + } - for (int i = 0 ; i < v_tcs.length ; i++) { - if (v_tcs[i].getName().equals(toolchainNameInCfg)) { - x = i; - break; + private static void internalAddGBSOption(IConfiguration config, String newOption) { + String cpp_compiler_id = SBI_PLATFORM_CPP_COMPILER_TOOL_ID; + String option_id = SBI_PLATFORM_CPP_COMPILER_GBS_OPTION_ID; + + // cpp compiler + ITool tool =config.getToolsBySuperClassId(cpp_compiler_id)[0]; + IOption gbsOption = tool.getOptionBySuperClassId(option_id); + ArrayList oldOptions = getGBSOptions(config); + + for(String op : oldOptions) { + if (newOption.equals(op)) { + return; } } - IToolChain tc = v_tcs[x]; - if (tc == null) return; - - - foim.setToolChain(tc); - - try { - mod.apply(); - } catch (CoreException e) { - ManagedBuilderUIPlugin.log(e); - } + oldOptions.add(newOption); + ManagedBuildManager.setOption( config, tool, gbsOption, oldOptions.toArray( new String[0] )); } - - public static String updateBuildTargetConfiguration( IConfiguration config ) throws SBIException { - - // get target name - String targetID = getBuildTargetName( config ); - - // if targetID is null, set default target name - if ( targetID == null ) { - targetID = SBI_DEFAULT_TARGET_NAME; - } - - SmartBuildInterface sbi = SmartBuildInterface.getInstance(); - - // if target exist , just return - if ( sbi.checkTargetID(targetID)) { - return targetID; - } - - String rootstrapID = sbi.getRootstrapIDFromTargetID(targetID); - String toolchainID = sbi.getToolchainIDFromTargetID(targetID); - // check rootstrap name - if ( !sbi.checkRootstrapID(rootstrapID) ) { - // set default - if ( config.getName().contains(SBI_DEVICE_CONFIG_SUFFIX) ) { - rootstrapID = SBI_ARM_ROOTSTRAP_NAME; - } else { - rootstrapID = SBI_I386_ROOTSTRAP_NAME; + public static void removeGBSOptions( IConfiguration config, String option ) + { + if (config instanceof MultiConfiguration) { + Object o[] = ((MultiConfiguration) config).getItems(); + for (IConfiguration c : (IConfiguration[])o) { + internalRemoveGBSOption(c, option); } + } else { + internalRemoveGBSOption(config, option); } + } + + private static void internalRemoveGBSOption(IConfiguration config, String option) { + String cpp_compiler_id = SBI_PLATFORM_CPP_COMPILER_TOOL_ID; + String option_id = SBI_PLATFORM_CPP_COMPILER_GBS_OPTION_ID; - // check toolchain name - if ( !sbi.checkToolchainID(toolchainID) ) { - // change "gcc-4.5.3-i386.sb2" , "gcc-4.5-i386.cdeb.sb2" - if ( ( toolchainID.equals("gcc-4.5.3-i386.sb2") || toolchainID.equals("gcc-4.5-i386.cdeb.sb2") ) && - sbi.checkToolchainID( SBI_I386_SBOX2_TOOLCHAIN_NAME ) ) { - toolchainID = SBI_I386_SBOX2_TOOLCHAIN_NAME; - } - // change "gcc-4.5.3-armel.sb2" , "gcc-4.5-armel.cdeb.sb2" - else if ( ( toolchainID.equals("gcc-4.5.3-armel.sb2") || toolchainID.equals("gcc-4.5-armel.cdeb.sb2") ) && - sbi.checkToolchainID( SBI_ARM_SBOX2_TOOLCHAIN_NAME ) ) { - toolchainID = SBI_ARM_SBOX2_TOOLCHAIN_NAME; + // cpp compiler + ITool tool =config.getToolsBySuperClassId(cpp_compiler_id)[0]; + IOption gbsOption = tool.getOptionBySuperClassId(option_id); + ArrayList oldOptions = getGBSOptions(config); + ArrayList newOptions = new ArrayList(); + String removeKey = option.split("=")[0]; + for(String op : oldOptions) { + String key = op.split("=")[0]; + if (removeKey.equals(key)) { + continue; } else { - // set default - if ( config.getName().contains(SBI_DEVICE_CONFIG_SUFFIX) ) { - toolchainID = SBI_ARM_TOOLCHAIN_NAME; - } else { - toolchainID = SBI_I386_TOOLCHAIN_NAME; - } + newOptions.add(op); } } + + ManagedBuildManager.setOption( config, tool, gbsOption, newOptions.toArray( new String[0] )); + } + + public static void replaceGBSOptions( IConfiguration config, String option ) + { + removeGBSOptions(config, option); + addGBSOptions(config, option); + } + + public static ArrayList getGBSOptions( IConfiguration config ) + { + String cpp_compiler_id = SBI_PLATFORM_CPP_COMPILER_TOOL_ID; + String option_id = SBI_PLATFORM_CPP_COMPILER_GBS_OPTION_ID; + + ArrayList flags = new ArrayList(); - // create target name && update configuration - targetID = sbi.makeTargetID( rootstrapID, toolchainID ); - setBuildTargetName(config, targetID); + // c compiler + ITool tool =config.getToolsBySuperClassId(cpp_compiler_id)[0]; + IOption gbsOption = tool.getOptionBySuperClassId(option_id); - // if target exist, create - if ( !sbi.checkTargetID(targetID)) { - sbi.writeTargetCfgFile(targetID); + + try { + for ( String f: gbsOption.getStringListValue() ) { + flags.add( f ); + } + } catch (BuildException e) { + e.printStackTrace(); } - return targetID; + return flags; } + protected static boolean isCPPProject( IConfiguration config ) + { + try { + IProject project = (IProject)config.getOwner(); + if ( project.hasNature( CCProjectNature.CC_NATURE_ID ) ) + return true; + } catch (CoreException e1) { + e1.printStackTrace(); + } + + return false; + } + + public static void changeToolchain(IConfiguration config, String targetId) { + setBuildTargetName(config, targetId); + setToolCommand(config); + } public static String getRootstrapPath( IConfiguration config ) { try { - - // if not exist, update target configuration - String targetID = updateBuildTargetConfiguration( config ); - - // return rootstrap + String targetID = getBuildTargetName(config); + if (targetID == null) { + targetID = getDefaultBuildTargetName(config); + } SmartBuildInterface sbi = SmartBuildInterface.getInstance(); - return sbi.getRootstrapPath(targetID); - + String path = sbi.getRootstrapPath(targetID); + if (path == null) { + return ""; + } else { + return sbi.getRootstrapPath(targetID); + } } catch (SBIException e) { e.printStackTrace(); return "/"; } - } + } } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformMakeGenerator.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformMakeGenerator.java index 2276e20..ace14f7 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformMakeGenerator.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformMakeGenerator.java @@ -1,31 +1,30 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; import org.eclipse.cdt.managedbuilder.core.IBuilder; import org.eclipse.cdt.managedbuilder.core.IConfiguration; @@ -51,15 +50,6 @@ public class PlatformMakeGenerator implements IManagedBuilderMakefileGenerator2 private IProject project; private IPath topBuildDir; private IConfiguration config; - - public final static String SBI_MESSAGE_NEED_PROJECT_CONVERSION = - "Old project type detected!\nPlease upgrade your project.\n" + - " 1. Open the popup-menu by clicking right mouse button on your project\n" + - " 2. Select \"Convert To...\" menu item to open a project converter dialog.\n" + - " 3. Select \"Upgrade Tizen .....\" item on the dialog.\n" + - " 4. Check if all project options are set correctly.\n" + - " (Some options may not be transferred automatically)"; - @Override public void generateDependencies() throws CoreException { @@ -68,21 +58,8 @@ public class PlatformMakeGenerator implements IManagedBuilderMakefileGenerator2 @Override public MultiStatus generateMakefiles(IResourceDelta delta) - throws CoreException { - - if ( PlatformConfigurationManager.isOldConfiguration( config ) ) { - - //SBIException ex = new SBIException(SLPApplicationProjectConverter.SBI_MESSAGE_NEED_PROJECT_CONVERSION); - SBIException ex = new SBIException(SBI_MESSAGE_NEED_PROJECT_CONVERSION); - ex.showErrorDialog(); - - throw new CoreException( new MultiStatus( - ManagedBuilderCorePlugin.getUniqueIdentifier(), - IStatus.ERROR, - new String(String.format("Build failed! Please upgrade project!" )), - null) ); - } - + throws CoreException { + // if Makefile does not exist, regenerate "Makefile" IFolder configDir = project.getFolder( config.getName() ); if ( !configDir.exists() ) @@ -130,20 +107,7 @@ public class PlatformMakeGenerator implements IManagedBuilderMakefileGenerator2 } @Override - public MultiStatus regenerateMakefiles() throws CoreException { - - if ( PlatformConfigurationManager.isOldConfiguration( config ) ) { - - //SBIException ex = new SBIException(SLPApplicationProjectConverter.SBI_MESSAGE_NEED_PROJECT_CONVERSION); - SBIException ex = new SBIException(SBI_MESSAGE_NEED_PROJECT_CONVERSION); - ex.showErrorDialog(); - - throw new CoreException( new MultiStatus( - ManagedBuilderCorePlugin.getUniqueIdentifier(), - IStatus.ERROR, - new String(String.format("Build failed! Please upgrade project!" )), - null) ); - } + public MultiStatus regenerateMakefiles() throws CoreException { // Check topdir folder exist topBuildDir = createDirectory(config.getName()); diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectConverter.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectConverter.java index 819f040..7024520 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectConverter.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectConverter.java @@ -1,31 +1,30 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; import org.eclipse.cdt.core.model.CoreModel; @@ -89,7 +88,8 @@ public class PlatformProjectConverter implements IConvertManagedBuildObject { } Configuration newConfig = createNewConfiguration( config , toId ); - String newTargetName = getNewBuildTargetName( config , toId ); + //String newTargetName = getNewBuildTargetName( config , toId ); + String newTargetName = PlatformConfigurationManager.getBuildTargetName(config); // target name if (!sbi.checkTargetID(newTargetName)) { @@ -131,9 +131,9 @@ public class PlatformProjectConverter implements IConvertManagedBuildObject { Configuration parentConfig = null; if ( toId.equals(PlatformConfigurationManager.SBI_PROJECT_TYPE_ID) ) { - if ( config.getParent().getId().contains("custom.debian.emulator") ) { + if ( config.getParent().getId().contains("emulator") ) { parentConfig = (Configuration)ManagedBuildManager.getExtensionConfiguration( PlatformConfigurationManager.SBI_DEFAULT_I386_CONFIGRATION_ID ); - } else if ( config.getParent().getId().contains("custom.debian.device") ) { + } else if ( config.getParent().getId().contains("device") ) { parentConfig = (Configuration) ManagedBuildManager.getExtensionConfiguration( PlatformConfigurationManager.SBI_DEFAULT_ARM_CONFIGRATION_ID ); } else { parentConfig = (Configuration)ManagedBuildManager.getExtensionConfiguration( PlatformConfigurationManager.SBI_DEFAULT_ARM_CONFIGRATION_ID ); @@ -157,7 +157,7 @@ public class PlatformProjectConverter implements IConvertManagedBuildObject { return newConfig; } - + /* protected String getNewBuildTargetName( IConfiguration config , String toId ) { String newTargetName = null; @@ -179,5 +179,6 @@ public class PlatformProjectConverter implements IConvertManagedBuildObject { return newTargetName; } + */ } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentBuilder.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentBuilder.java index bf5ce7a..171f674 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentBuilder.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentBuilder.java @@ -1,38 +1,39 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; -import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.Path; import org.tizen.nativecommon.build.CommonProjectDependentBuilder; import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.password.SudoPasswdManager; + public class PlatformProjectDependentBuilder extends CommonProjectDependentBuilder { @@ -95,20 +96,52 @@ public class PlatformProjectDependentBuilder extends CommonProjectDependentBuild @Override protected String getDebugOption(String[] arrOption) { - String gdbOptions = "-gdb-options=\'"; - for (int i = 0 ; i < arrOption.length ; i++) { - gdbOptions = gdbOptions.concat(arrOption[i] + " "); - } - gdbOptions = gdbOptions.concat("\' "); + String options = ""; - String sysroot=""; - try { - sysroot = String.format("-sysroot=%s", getSbi().getRootstrapPath(getTargetID()) ); - } catch (SBIException e) { - e.printStackTrace(); - } + String targetId = getTargetID(); - return gdbOptions + sysroot; + if (targetId.contains("obs")) { + String passwd = SudoPasswdManager.getSudoPassword(); + options = String.format("-passwd=%s -gdb-options=\'", passwd); + String path = ""; + try { + path = new Path(getSbi().getRootstrapPath(getTargetID())).makeAbsolute().toOSString(); + } catch (SBIException e) { + e.printStackTrace(); + } + String rootstrapPath = getSbi().getPlatformRootstrapPath(path); + for (int i = 0 ; i < arrOption.length ; i++) { + if (arrOption[i] == null) { + break; + } else if (arrOption[i].startsWith("--cd")) { + continue; + } else if (arrOption[i].contains(rootstrapPath)) { + String op = arrOption[i].replaceAll(rootstrapPath, ""); + options = options.concat(op + " "); + } else { + options = options.concat(arrOption[i] + " "); + } + } + options = String.format("-rootpath=%s ", rootstrapPath).concat(options); + options = options.concat("\' "); + return options; + + } else { + options = "-gdb-options=\'"; + for (int i = 0 ; i < arrOption.length ; i++) { + options = options.concat(arrOption[i] + " "); + } + options = options.concat("\' "); + String sysroot=""; + String rootstrapPath = ""; + try { + rootstrapPath = getSbi().getRootstrapPath(getTargetID()); + sysroot = String.format("-sysroot=%s", rootstrapPath ); + } catch (SBIException e) { + e.printStackTrace(); + } + return options.concat(sysroot); + } } @Override @@ -117,14 +150,12 @@ public class PlatformProjectDependentBuilder extends CommonProjectDependentBuild } @Override - public void setToolCommand(IConfiguration config, String rootstrapCfgName) { - PlatformConfigurationManager.setToolCommand(config, rootstrapCfgName); + public void setToolCommand(IConfiguration config) { + PlatformConfigurationManager.setToolCommand(config); } @Override - public void changeToolchain(IConfiguration config, - ICResourceDescription cfgd, String toolchainNameInCfg) { - PlatformConfigurationManager.changeToolchain(config, cfgd, toolchainNameInCfg); + public void changeToolchain(IConfiguration config, String targetId) { + PlatformConfigurationManager.changeToolchain(config, targetId); } - } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentPackager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentPackager.java index fb248c3..e2c814c 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentPackager.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectDependentPackager.java @@ -1,38 +1,43 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; import org.tizen.nativecommon.build.CommonProjectDependentPackager; +import org.tizen.nativecommon.build.SmartBuildInterface; import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.password.SudoPasswdManager; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; public class PlatformProjectDependentPackager extends CommonProjectDependentPackager { @@ -56,77 +61,129 @@ public class PlatformProjectDependentPackager extends CommonProjectDependentPack super(project); } - @Override - public String getPackageOption() { - String workingDir = getWorkingDir(); - - String options = String.format( - "-WORKING_DIR=%s", - workingDir ); - return options; - } - @Override - public String getPackageOption(IConfiguration config) { + public String getPackageOption(IConfiguration config, String pkgType) { String workingDir = getWorkingDir(config); + String options = ""; + String passwd = SudoPasswdManager.getSudoPassword(); + if (passwd == null) { + return null; + } - String options = String.format( - "-WORKING_DIR=%s", - workingDir ); + if (RPM.equals(pkgType)) { + options = String.format( + "-PASSWD=%s " + + "-WORKING_DIR=%s " + + "-PKG_TYPE=%s" , + passwd, + workingDir, + pkgType ); + } else { + options = String.format( + "-WORKING_DIR=%s " + + "-PKG_TYPE=%s" , + workingDir, + pkgType ); + } return options; } - public void buildPackage() throws SBIException { + public String getPackageOption(IConfiguration config, PlatformRootstrap rootstrap) { + String workingDir = getWorkingDir(config); + String passwd = SudoPasswdManager.getSudoPassword(); + String snapshots = ""; + for (String s : rootstrap.getRepositoryURLs()) { + snapshots = snapshots + " " + s; + } - String targetID = getTargetID(); - String projectDir = getProjectPath(); - String options = getPackageOption(); + String gbsOptions = ""; + for(String op : PlatformConfigurationManager.getGBSOptions(config)) { + gbsOptions = gbsOptions + " " + op; + } - sbi.actionConsole("buildpackage", options, targetID, projectDir, "Packaging" ); - } - - - public void buildPackage(String configName) throws SBIException { + gbsOptions = gbsOptions.trim(); + + String options = String.format( + "-PASSWD=%s " + + "-WORKING_DIR=%s " + + "-SNAPSHOTS=\"%s\" " + + "-OPTIONS=\"%s\" ", + passwd, + workingDir, + snapshots.trim(), + gbsOptions + ); + return options; + } + + public void buildPackage(String pkgType) throws SBIException { + IConfiguration config = getCurrentConfiguration(); + + buildPackage(config, pkgType); + } + + + public void buildPackage(String configName, String pkgType) throws SBIException { IConfiguration[] configurations = ManagedBuildManager.getBuildInfo(project).getManagedProject().getConfigurations(); IConfiguration config = null; - + for (IConfiguration c : configurations) { if (c.getName().equals(configName) ) { config = c; break; } - } - - String targetID = getTargetID(config); - String projectDir = getProjectPath(); - String options = getPackageOption(config); + } - sbi.actionConsole("buildpackage", options, targetID, projectDir, "Packaging" ); + buildPackage(config, pkgType); } + - public void buildPackageDependencyCheck() throws SBIException { + // command "build package" from specified configuration and pkgType + private void buildPackage(IConfiguration config, String pkgType) throws SBIException { + String targetId = getTargetID(config); + String projectDir = getProjectPath(); + String rootId = sbi.getRootstrapIDFromTargetID(targetId); + PlatformRootstrap rt = RootstrapManager.getRootstrap(rootId); - String targetID = getTargetID(); + String options = getPackageOption(config, rt); + + if (options == null) { + return; + } + + String[] new_envs = null; + if ( PreferencesManager.isProxyUsed() ) { + String protocol = PreferencesManager.getProxyProtocol(); + String host = PreferencesManager.getProxyHost(); + int port = PreferencesManager.getProxyPort(); + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + String envKey = String.format("%s_proxy", protocol); + String envValue = String.format("%s://%s:%d", protocol, host, port); + new_envs = sbi.addEnvironmentVariableArray(envKey, envValue); + } + sbi.actionConsole("buildpackage", options, targetId, projectDir, new_envs, "Packaging" ); //$NON-NLS-1$ //$NON-NLS-2$ + } + + + public void buildPackageDependencyCheck() throws SBIException { + + IConfiguration config = getCurrentConfiguration(); + String targetID = getTargetID(config); String projectDir = getProjectPath(); String options = getPackageDependencyCheckOption(); - - sbi.actionConsole("checkbuilddeps", options, targetID, projectDir, "Packaging" ); - } - @Override - public String getTargetID() { - IConfiguration config = getConfiguration(); - return PlatformConfigurationManager.getBuildTargetName(config); + sbi.actionConsole("checkbuilddeps", options, targetID, projectDir, "Packaging" ); } - + + @Override - public String getTargetID(IConfiguration config) { + public String getTargetID(IConfiguration config) { return PlatformConfigurationManager.getBuildTargetName(config); } - + @Override public boolean isDependencyCheckSuppoted() { return true; @@ -135,7 +192,7 @@ public class PlatformProjectDependentPackager extends CommonProjectDependentPack @Override protected String getPackageDependencyCheckOption() { return ""; - } + } @Override public boolean isPackageCheckSuppoted() { @@ -143,7 +200,19 @@ public class PlatformProjectDependentPackager extends CommonProjectDependentPack } @Override - public boolean checkPackageFile() { + public boolean checkPackageFile(String pkgType) { return false; } + + @Override + public void buildPackage(String configName, String pkgType, boolean signApp) + throws SBIException, CoreException { + buildPackage(configName, pkgType); + } + + @Override + public void buildPackage(String pkgType, boolean signApp) + throws SBIException, CoreException { + buildPackage(pkgType); + } } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectPackaging.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectPackaging.java new file mode 100644 index 0000000..c421341 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/PlatformProjectPackaging.java @@ -0,0 +1,85 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build; + +import java.util.ArrayList; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.MessageDialog; +import org.tizen.nativecommon.build.CommonBuildMessages; +import org.tizen.nativecommon.build.CommonProjectDependentPackager; +import org.tizen.nativecommon.build.ProjectTypeManager; +import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; + +public class PlatformProjectPackaging { + public static boolean RPMPackaging(final IProject targetProj, IConfiguration config, IProgressMonitor monitor) { + String PKGTYPE = "RPM"; + monitor.beginTask("Packaging", 1); + + CommonProjectDependentPackager packager = ProjectTypeManager.getProjectPackagerInstance(targetProj); + PlatformCheckCancelJob cancelJob = new PlatformCheckCancelJob(monitor, targetProj, packager.getSbi()); + Thread checkCancelThread = new Thread(cancelJob); + checkCancelThread.start(); + + try { + monitor.subTask("Packaging " + targetProj.getName()); + packager.buildPackage(PKGTYPE); + } catch (SBIException e) { + e.printStackTrace(); + cancelJob.setFinishFlag(true); + monitor.done(); + return false; + } catch (CoreException e) { + cancelJob.setFinishFlag(true); + monitor.done(); + return false; + } + + cancelJob.setFinishFlag(true); + monitor.done(); + + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + ArrayList pkgfiles = launchUtils.getProjectPackages(targetProj, config.getName()); + + try { + targetProj.refreshLocal(IResource.DEPTH_INFINITE, null ); + } catch (CoreException e) { + e.printStackTrace(); + } + + return !pkgfiles.isEmpty(); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/ui/GBSBuildConfigurationTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/ui/GBSBuildConfigurationTab.java new file mode 100644 index 0000000..51ff10c --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/build/ui/GBSBuildConfigurationTab.java @@ -0,0 +1,461 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.build.ui; + + +import java.util.ArrayList; + +import org.eclipse.cdt.core.settings.model.ICResourceDescription; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.internal.core.MultiConfiguration; +import org.eclipse.cdt.managedbuilder.ui.properties.AbstractCBuildPropertyTab; +import org.eclipse.cdt.ui.newui.ICPropertyProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Label; +import org.eclipse.swt.widgets.Text; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.gbs.GBSOption; +import org.tizen.nativeplatform.gbs.GBSOptionManager; + +@SuppressWarnings("restriction") +public class GBSBuildConfigurationTab extends AbstractCBuildPropertyTab { + protected boolean checked; + private Button option_clean; + private Button option_ccache; + private Button option_overwrite; + private Button option_includeall; + private Button option_skipRepos; + private Button option_noConfigure; + private Button option_commit; + private Button option_extraPacks; + private Button option_threads; + private Button option_exclude; + private Button option_keepPacks; + private Button option_noinit; + private Button option_incremental; + private Text text_extraPacks; + private Text text_exclude; + private Text text_threads; + private Text text_commit; + + private final String EMPTY_STRING = ""; + private final String PREFIX_DESC = ": "; + private final String ERROR_LABEL = "Check if GBS(>= %s) is installed."; + + private String[] avaiableOptions = { + "--clean", + "--ccache", + "--overwrite", + "--include-all", + "--skip-conf-repos", + "--no-configure", + "--threads", + "--commit", + "--exclude", + "--extra-packs", + "--keep-packs", + "--noinit", + "--incremental" + }; + + private boolean[] checkOptions = { + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + }; + + private Button[] buttons = { + option_clean, + option_ccache, + option_overwrite, + option_includeall, + option_skipRepos, + option_noConfigure, + option_threads, + option_commit, + option_exclude, + option_extraPacks, + option_keepPacks, + option_noinit, + option_incremental + + }; + + private Text[] texts = { + null, + null, + null, + null, + null, + null, + text_threads, + text_commit, + text_exclude, + text_extraPacks, + null, + null, + null + }; + + public void createControls(Composite _parent, ICPropertyProvider _provider) { + page = _provider; + if (canBeVisible()) { + createControls(_parent); + } + } + + @Override + protected void createControls(Composite parent) { + super.createControls(parent); + usercomp.setLayout(new GridLayout(1, false)); + + if (!GBSOptionManager.isInitialized()) { + GBSOptionManager.initOptions(); + } + + if (GBSOptionManager.getOptions().isEmpty()) { + createErrorComposite(usercomp); + return; + } + + Composite composite = new Composite(usercomp, SWT.NONE); + GridLayout gridLayout = new GridLayout(2,false); + gridLayout.marginBottom = 0; + gridLayout.marginTop = 0; + gridLayout.marginLeft = 0; + gridLayout.marginRight = 0; + GridData gd = new GridData(GridData.BEGINNING, GridData.FILL, false, false); + gd.widthHint = 800; + composite.setLayout(gridLayout); + composite.setLayoutData(gd); + + createCleanOption(composite, 0); + createCcacheOption(composite, 1); + createOverwriteOption(composite, 2); + createIncludeAllOption(composite, 3); + createSkipReposOption(composite, 4); + createNoConfigureOption(composite, 5); + createThreadsOption(composite, 6); + createCommitOption(composite, 7); + createExcludeOption(composite, 8); + createExtraPacksOption(composite, 9); + createKeepPacksOption(composite, 10); + createNoInitOption(composite, 11); + createIncrementalOption(composite, 12); + } + + private void createErrorComposite(Composite parent) { + Composite composite = new Composite(usercomp, SWT.NONE); + GridLayout gridLayout = new GridLayout(1,false); + gridLayout.marginBottom = 0; + gridLayout.marginTop = 0; + gridLayout.marginLeft = 0; + gridLayout.marginRight = 0; + GridData gd = new GridData(GridData.BEGINNING, GridData.FILL, false, false); + gd.widthHint = 800; + composite.setLayout(gridLayout); + composite.setLayoutData(gd); + + Label errorLabel = new Label(composite, SWT.NONE); + errorLabel.setText(String.format(ERROR_LABEL, Double.toString(GBSOptionManager.MIN_GBS_VERSION))); + } + + private void createCcacheOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createCleanOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createOverwriteOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createIncludeAllOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createSkipReposOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createNoConfigureOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createExtraPacksOption(Composite parent, int index) { + createOptionWithText(parent, index); + } + + private void createExcludeOption(Composite parent, int index) { + createOptionWithText(parent, index); + } + + private void createCommitOption(Composite parent, int index) { + createOptionWithText(parent, index); + } + + private void createThreadsOption(Composite parent, final int index) { + createOptionWithText(parent, index); + } + + private void createKeepPacksOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createNoInitOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createIncrementalOption(Composite parent, int index) { + createOption(parent, index); + } + + private void createOptionWithText(Composite parent, final int index) { + + GBSOption op = GBSOptionManager.getOption(avaiableOptions[index]); + if (op == null) { + return; + } + + buttons[index] = new Button(parent, SWT.CHECK); + buttons[index].setText(op.getOption()); + buttons[index].setSelection(checkOptions[index]); + + buttons[index].addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + Button button = (Button) event.widget; + if (button.getSelection()) { + texts[index].setEnabled(true); + checkOptions[index] = true; + if (!isMultiConfiguration()) { + String value = texts[index].getText(); + String option = String.format("%s=%s", avaiableOptions[index], value); + PlatformConfigurationManager.addGBSOptions(getCfg(), option); + } + } else { + texts[index].setEnabled(false); + checkOptions[index] = false; + if (!isMultiConfiguration()) { + PlatformConfigurationManager.removeGBSOptions(getCfg(), avaiableOptions[index]); + } + } + } + }); + + Label desc = new Label(parent, SWT.NONE); + desc.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + desc.setText(getDesc(op)); + + texts[index] = new Text(parent, SWT.BORDER); + GridData gd = new GridData(GridData.FILL_BOTH); + gd.horizontalSpan = 2; + texts[index].setLayoutData(gd); + texts[index].setEnabled(checkOptions[index]); + texts[index].addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent event) { + Text text = (Text)event.widget; + String value = text.getText(); + if (value.isEmpty()) { + return; + } + if (!isMultiConfiguration()) { + String option = String.format("%s=%s", avaiableOptions[index], value); + PlatformConfigurationManager.replaceGBSOptions(getCfg(), option); + } + } + }); + + } + + private void createOption(Composite parent, final int index) { + + GBSOption op = GBSOptionManager.getOption(avaiableOptions[index]); + if (op == null) { + return; + } + buttons[index] = new Button(parent, SWT.CHECK); + buttons[index].setText(op.getOption()); + buttons[index].setSelection(checkOptions[index]); + buttons[index].addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + Button button = (Button) event.widget; + if (button.getSelection()) { + if (!isMultiConfiguration()) { + PlatformConfigurationManager.addGBSOptions(getCfg(), avaiableOptions[index]); + } + checkOptions[index] = true; + } else { + if (!isMultiConfiguration()) { + PlatformConfigurationManager.removeGBSOptions(getCfg(), avaiableOptions[index]); + } + checkOptions[index] = false; + } + } + }); + + GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); + buttons[index].setLayoutData(gd); + + Label desc = new Label(parent, SWT.NONE); + desc.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + desc.setText(getDesc(op)); + } + + @Override + protected void performOK() { + // if multi configuration, set new gbs options. + if (isMultiConfiguration()) { + ArrayList newOptions = new ArrayList(); + for (int i = 0 ; i < avaiableOptions.length ; i++) { + boolean checked = checkOptions[i]; + if (checked) { + String option = EMPTY_STRING; + if (texts[i] != null) { + String value = texts[i].getText(); + option = String.format("%s=%s", avaiableOptions[i], value); + } else { + option = avaiableOptions[i]; + } + newOptions.add(option); + } + } + PlatformConfigurationManager.setGBSOptions(getCfg(), newOptions); + } + } + + @Override + public boolean canBeVisible() { + IManagedProject managedProject = getCfg().getManagedProject(); + String projectArtifactType = managedProject.getProjectType() != null ? + managedProject.getProjectType().getBuildArtefactType().getId() : null; + if ( projectArtifactType != null && + projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE)) { + return true; + } + + return false; + } + + @Override + protected void performApply(ICResourceDescription src, + ICResourceDescription dst) { + } + + @Override + protected void performDefaults() { + } + + @Override + protected void updateData(ICResourceDescription cfg) { + + // if multi configuration, just do initialize. + if (isMultiConfiguration()) { + for (int i = 0 ; i < avaiableOptions.length ; i++) { + initControl(i); + } + } else { + IConfiguration conf = getCfg(); + ArrayList options = PlatformConfigurationManager.getGBSOptions(conf); + for (int i = 0 ; i < avaiableOptions.length ; i++) { + initControl(i); + String op = avaiableOptions[i]; + for (String s : options) { + String[] strs = s.split("="); + s = strs[0].trim(); + if (s.equals(op)) { + checkOptions[i] = true; + buttons[i].setSelection(true); + if (texts[i] != null) { + texts[i].setEnabled(true); + if (strs.length == 2) { + texts[i].setText(strs[1]); + } + } + } + } + } + } + } + + private void initControl(int index) { + checkOptions[index] = false; + buttons[index].setSelection(false); + if (texts[index] != null) { + texts[index].setEnabled(false); + texts[index].setText(EMPTY_STRING); + } + } + + private boolean isMultiConfiguration() { + IConfiguration config = getCfg(); + return (config instanceof MultiConfiguration); + } + + private String getDesc(GBSOption op) { + return PREFIX_DESC + filterDesc(op.getDesc()); + } + + + @Override + protected void updateButtons() { + } + + private String filterDesc(String desc) { + if (desc.length() > 85) { + int index = desc.indexOf(" ", 85); + if (index < 85) { + return desc; + } + String desc1 = desc.substring(0, index); + String desc2 = desc.substring(index).trim(); + return desc1 + "\n " + filterDesc(desc2); + } + return desc; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOption.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOption.java new file mode 100644 index 0000000..7516fb6 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOption.java @@ -0,0 +1,68 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.gbs; + +import java.util.ArrayList; + +public class GBSOption { + private String option; + private String desc; + private boolean checked; + + public GBSOption(String op, String desc, boolean checked) { + for (String s : op.split(",")) { + s = s.trim(); + if (s.startsWith("--")) { + option = s; + break; + } + + } + this.desc = desc; + this.checked = checked; + } + + public String getOption() { + return option.split(" ")[0]; + } + + public void setDesc(String d) { + desc = d; + } + + public String getDesc() { + return desc; + } + + public boolean getChecked() { + return checked; + } + + + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOptionManager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOptionManager.java new file mode 100644 index 0000000..545c766 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/gbs/GBSOptionManager.java @@ -0,0 +1,137 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.gbs; + +import java.util.ArrayList; + +import org.tizen.nativeplatform.util.CommandLauncher; + +public class GBSOptionManager { + private static ArrayList options = new ArrayList(); + private static boolean initialized = false; + public static double MIN_GBS_VERSION = 0.12; + + public static void addOption(GBSOption op) { + options.add(op); + } + + public static boolean isInitialized() { + return initialized; + } + + @SuppressWarnings("unchecked") + public static ArrayList getOptions() { + return (ArrayList)options.clone(); + } + + public static GBSOption getOption(String op) { + for (GBSOption o : options) { + if (o.getOption().startsWith(op)) { + return o; + } + } + + return null; + } + + private static boolean checkGBSTool() { + + // check GBS command + try { + if ( !CommandLauncher.execute("which gbs") ) { + return false; + } + String result = CommandLauncher.executeOutput("gbs --version", null, true, null); + + // result format : gbs [version] + String[] results = result.trim().split(" "); + if (results.length != 2) { + return false; + } + String command = results[0]; + double ver = Double.parseDouble(results[1]); + + if ( !command.equals("gbs") || ver < MIN_GBS_VERSION) { + return false; + } + + return true; + + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + } + + public static void initOptions() { + options.clear(); + if (!checkGBSTool()) { + return; + } + String command = "gbs build --help"; + String output = ""; + try { + output = CommandLauncher.executeOutput(command); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + boolean startArgs = false; + for (String s : output.split("\n")) { + if (startArgs) { + s = s.trim(); + String[] values = s.split(" +"); + if (values.length > 1) { + String option = values[0].trim(); + String desc = values[1].trim(); + GBSOption op = new GBSOption(option, desc, false); + options.add(op); + } else if (values.length == 1 && !values[0].trim().startsWith("-")) { + GBSOption op = options.get(options.size() - 1); + String desc = values[0].trim(); + String newDesc = ""; + if (!op.getDesc().isEmpty()) { + newDesc = op.getDesc() + " " + desc; + } else { + newDesc = desc; + } + op.setDesc(newDesc); + } else if (values.length == 1 && values[0].trim().startsWith("-")) { + String option = values[0].trim(); + GBSOption op = new GBSOption(option, "", false); + options.add(op); + } + //System.out.print(values[1]); + } + if (s.startsWith("optional arguments:")) { + startArgs = true; + } + } + initialized = true; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/CachedGitEntries.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/CachedGitEntries.java new file mode 100644 index 0000000..1a0ee93 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/CachedGitEntries.java @@ -0,0 +1,44 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import java.util.List; + +import org.eclipse.cdt.ui.wizards.EntryDescriptor; + +public class CachedGitEntries { + private static List gitEnties; + + public static void setGitEntries(List g) { + gitEnties = g; + } + + public static List getGitEntries() { + return gitEnties; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/FileGitIndexParser.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/FileGitIndexParser.java new file mode 100644 index 0000000..e183fc3 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/FileGitIndexParser.java @@ -0,0 +1,66 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; + +import org.tizen.nativeplatform.git.model.GitDescription; +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public class FileGitIndexParser implements IGitIndexParser { + + ArrayList GitDescs = new ArrayList(); + + @Override + public ArrayList parse(PreferencesManager.SiteConfiguration config) { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(config.listLocation)); + while(true) { + String str = reader.readLine(); + if (str == null || str.isEmpty()) { + break; + } + GitDescription gitDesc = new GitDescription(); + gitDesc.setProject(str.trim()); + GitDescs.add(gitDesc); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return GitDescs; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommander.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommander.java new file mode 100644 index 0000000..d41aacb --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommander.java @@ -0,0 +1,301 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.Map.Entry; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.egit.core.Activator; +import org.eclipse.egit.core.op.CloneOperation; +import org.eclipse.egit.core.op.ConnectProviderOperation; +import org.eclipse.egit.core.op.ListRemoteOperation; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.wizard.IWizardContainer; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryCache.FileKey; +import org.eclipse.jgit.storage.file.FileRepository; +import org.eclipse.jgit.transport.URIish; +import org.eclipse.jgit.util.FS; +import org.eclipse.ui.PlatformUI; +import org.osgi.service.prefs.BackingStoreException; + +public class GitCommander { + private final String GITPATH_DELIMITER = "/"; + private final String GITPATH_DELIMITER2 = ":"; + private final String REMOTE_NAME = "origin"; + @SuppressWarnings("deprecation") + private final IEclipsePreferences prefs = new InstanceScope().getNode(Activator.getPluginId()); + + /** The preferences to store the directories known to the Git Repositories view */ + public static final String PREFS_DIRECTORIES = "GitRepositoriesView.GitDirectories"; //$NON-NLS-1$ + private String sshConn; + + public GitCommander(String sshConn) { + this.sshConn = sshConn; + } + + public List getAvailableRefs(IPath gitPath, IWizardContainer container) + throws InvocationTargetException, URISyntaxException, IOException { + + if (sshConn == "" || sshConn == null) { + return null; + } + + final ListRemoteOperation listRemoteOp; + final List availableRefs = new ArrayList(); + try { + URIish uri = new URIish(sshConn + GITPATH_DELIMITER + gitPath); + int timeout = 0; + + Repository db = new FileRepository(new File("/tmp")); + listRemoteOp = new ListRemoteOperation(db, uri, timeout); + + if (container != null) { + container.run(true, true, new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException { + listRemoteOp.run(monitor); + } + }); + } else { + listRemoteOp.run(null); + } + + final Ref idHEAD = listRemoteOp.getRemoteRef(Constants.HEAD); + Ref head = null; + for (final Ref r : listRemoteOp.getRemoteRefs()) { + final String n = r.getName(); + if (!n.startsWith(Constants.R_HEADS)) + continue; + availableRefs.add(r); + if (idHEAD == null || head != null) + continue; + if (r.getObjectId().equals(idHEAD.getObjectId())) + head = r; + } + Collections.sort(availableRefs, new Comparator() { + public int compare(final Ref o1, final Ref o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + if (idHEAD != null && head == null) { + head = idHEAD; + availableRefs.add(0, idHEAD); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return availableRefs; + } + + public boolean CloneOperation(IPath projectPath, IPath gitPath, IWizardContainer container) + throws InvocationTargetException, URISyntaxException, IOException { + + if (sshConn == "" || sshConn == null) { + return false; + } + + try { + + URIish uri = new URIish(sshConn + GITPATH_DELIMITER + gitPath); + if ( uri.getScheme() == null ) { + uri = new URIish(sshConn + GITPATH_DELIMITER2 + gitPath); + } + File workdir = new File(projectPath.toOSString()); + int timeout = 0; + boolean allSelected = true; + + final CloneOperation op = new CloneOperation(uri, allSelected, + null, workdir, null, REMOTE_NAME, timeout); + + container.run(true, true, + new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, + InterruptedException { + op.run(monitor); + } + }); + + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + + return true; + } + + public void ApplySharedProject(IProject project, IWizardContainer container) { + // Applied shared project + final Map ret = new HashMap(1); + IPath selectedRepo = Path.fromOSString(".git"); + IPath localPathToRepo = project.getLocation().append(selectedRepo); + ret.put(project, localPathToRepo.toFile()); + final ConnectProviderOperation op = new ConnectProviderOperation(ret); + + try { + container.run(true, false, new IRunnableWithProgress() { + public void run(final IProgressMonitor monitor) + throws InvocationTargetException { + try { + op.execute(monitor); + PlatformUI.getWorkbench().getDisplay() + .syncExec(new Runnable() { + public void run() { + Set filesToAdd = new HashSet(); + // collect all files first + for (Entry entry : ret.entrySet()) + filesToAdd.add(entry.getValue()); + // add the files to the repository view + for (File file : filesToAdd) { + addConfiguredRepository(file); + } + } + }); + } catch (CoreException ce) { + //throw new InvocationTargetException(ce); + ce.printStackTrace(); + } + } + }); + } catch (InvocationTargetException e1) { + e1.printStackTrace(); + //e1 = e1.getCause(); + //if (e1 instanceof CoreException) { + // IStatus status = ((CoreException) e1).getStatus(); + // e1 = status.getException(); + //} + //Activator.handleError(UIText.SharingWizard_failed, e1, true); + } catch (InterruptedException e1) { + e1.printStackTrace(); + //Activator.handleError(UIText.SharingWizard_failed, e1, true); + } + } + + /** + * + * @param repositoryDir + * the Repository path + * @return true if the repository path was not yet configured + * @throws IllegalArgumentException + * if the path does not "look" like a Repository + */ + public boolean addConfiguredRepository(File repositoryDir) + throws IllegalArgumentException { + synchronized (prefs) { + + if (!FileKey.isGitRepository(repositoryDir, FS.DETECTED)) + throw new IllegalArgumentException(); + + String dirString; + try { + dirString = repositoryDir.getCanonicalPath(); + } catch (IOException e) { + dirString = repositoryDir.getAbsolutePath(); + } + + List dirStrings = getConfiguredRepositories(); + if (dirStrings.contains(dirString)) { + return false; + } else { + Set dirs = new HashSet(); + dirs.addAll(dirStrings); + dirs.add(dirString); + saveDirs(dirs); + return true; + } + } + } + + + /** + * + * @return the list of configured Repository paths; will be sorted + */ + public List getConfiguredRepositories() { + synchronized (prefs) { + Set configuredStrings = new HashSet(); + + String dirs = prefs.get(PREFS_DIRECTORIES, ""); //$NON-NLS-1$ + if (dirs != null && dirs.length() > 0) { + StringTokenizer tok = new StringTokenizer(dirs, + File.pathSeparator); + while (tok.hasMoreTokens()) { + String dirName = tok.nextToken(); + configuredStrings.add(dirName); + } + } + List result = new ArrayList(); + result.addAll(configuredStrings); + Collections.sort(result); + return result; + } + } + + + private void saveDirs(Set gitDirStrings) { + StringBuilder sb = new StringBuilder(); + for (String gitDirString : gitDirStrings) { + sb.append(gitDirString); + sb.append(File.pathSeparatorChar); + } + + prefs.put(PREFS_DIRECTORIES, sb.toString()); + try { + prefs.flush(); + } catch (BackingStoreException e) { + IStatus error = new Status(IStatus.ERROR, Activator.getPluginId(), + e.getMessage(), e); + Activator.getDefault().getLog().log(error); + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommanderMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitCommanderMessages.properties new file mode 100644 index 0000000..e69de29 diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitDescManager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitDescManager.java new file mode 100644 index 0000000..e8ed0b0 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitDescManager.java @@ -0,0 +1,63 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; + +import org.tizen.nativeplatform.git.model.GitDescription; + +public class GitDescManager { + private static Hashtable gitDescs; + + public static void setDescs(ArrayList descs) { + gitDescs = new Hashtable(); + + for( GitDescription desc: descs ) { + gitDescs.put(desc.getProject(), desc); + } + } + + public static ArrayList getDescs() { + ArrayList result = new ArrayList(); + + Iterator it = gitDescs.values().iterator(); + + while( it.hasNext() ) { + result.add( it.next() ); + } + + return result; + } + + + public static GitDescription getDesc( String projectName ) { + return gitDescs.get(projectName); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitIndexParserFactory.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitIndexParserFactory.java new file mode 100644 index 0000000..7b90fdf --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/GitIndexParserFactory.java @@ -0,0 +1,44 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public class GitIndexParserFactory { + public static IGitIndexParser getIndexParser(PreferencesManager.SiteConfiguration config) { + if ( config.listType.equals(PreferencesManager.GIT_LIST_WEB)) { + return new WebGitIndexParser(); + } + else if ( config.listType.equals(PreferencesManager.GIT_LIST_LOCAL) ){ + return new FileGitIndexParser(); + } + else { + return null; + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/IGitIndexParser.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/IGitIndexParser.java new file mode 100644 index 0000000..11a7012 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/IGitIndexParser.java @@ -0,0 +1,37 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import java.util.ArrayList; + +import org.tizen.nativeplatform.git.model.GitDescription; +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public interface IGitIndexParser { + public ArrayList parse(PreferencesManager.SiteConfiguration config); +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/WebGitIndexParser.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/WebGitIndexParser.java new file mode 100644 index 0000000..d02e460 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/WebGitIndexParser.java @@ -0,0 +1,128 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.ArrayList; + +import org.tizen.common.util.DialogUtil; +import org.tizen.nativeplatform.git.model.GitDescription; +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public class WebGitIndexParser implements IGitIndexParser { + + @Override + public ArrayList parse(PreferencesManager.SiteConfiguration config) { + boolean startTable = false; + boolean startTr = false; + boolean getProjectName = false; + boolean getDescription = false; + boolean getOwner = false; + String cacheFile = config.getListCacheFile(); + + ArrayList GitDescs = new ArrayList(); + if ( !(new File( cacheFile )).exists() ) { + GitDescription gitDesc = new GitDescription(); + gitDesc.setProject("no_category/no_project.git"); + gitDesc.setDesc("No Git information! Update Git Configuration in \"Windows->Preferences->Tizen SDK->Platform->Git Configuration\" "); + gitDesc.setOwner("None"); + + GitDescs.add(gitDesc); + return GitDescs; + } + + try { + BufferedReader in = new BufferedReader(new FileReader(cacheFile)); + GitDescription gitDesc = null; + String str; + while ((str = in.readLine()) != null) { + str = str.trim(); + if (startTable) { + if (str.startsWith("]*)?(\\s)*(/)?>", ""); + getProjectName = true; + gitDesc.setProject(project); + } + } else if (startTr && !getDescription) { + if (str.startsWith("]*)?(\\s)*(/)?>", ""); + getDescription = true; + gitDesc.setDesc(desc); + } + } else if (startTr && !getOwner) { + if (str.startsWith("]*)?(\\s)*(/)?>", ""); + getOwner = true; + gitDesc.setOwner(owner); + } + } + + } + if (!startTable && str.equals("")) { + startTable = true; + continue; + } + + if (startTable && str.equals("
")) { + startTable = false; + break; + } + } + } catch (MalformedURLException e) { + DialogUtil.openErrorDialog(e.toString()); + e.printStackTrace(); + return null; + } catch (IOException e) { + DialogUtil.openErrorDialog(e.toString()); + e.printStackTrace(); + return null; + } + return GitDescs; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitConfiguration.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitConfiguration.java new file mode 100644 index 0000000..ac3d60c --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitConfiguration.java @@ -0,0 +1,52 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git.model; + +public class GitConfiguration { + private String name = ""; + private String gitWeb = ""; + private String sshConn = ""; + + public GitConfiguration(String name, String gitWeb, String sshConn) { + this.name = name; + this.gitWeb = gitWeb; + this.sshConn = sshConn; + } + + public String getName() { + return name; + } + + public String getGitWeb() { + return gitWeb; + } + + public String getSshConn() { + return sshConn; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitDescription.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitDescription.java new file mode 100644 index 0000000..b24e0cb --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/git/model/GitDescription.java @@ -0,0 +1,62 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.git.model; + +public class GitDescription { + private String project = ""; + private String desc = ""; + private String owner = ""; + + public GitDescription() { + + } + + public String getProject() { + return project; + } + + public String getDesc() { + return desc; + } + + public String getOwner() { + return owner; + } + + public void setProject(String project) { + this.project = project; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public void setOwner(String owner) { + this.owner = owner; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ITizenLaunchConfigurationConstants.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ITizenLaunchConfigurationConstants.java new file mode 100644 index 0000000..c5434f1 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ITizenLaunchConfigurationConstants.java @@ -0,0 +1,47 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; + +public interface ITizenLaunchConfigurationConstants { + public static final String DEBUGGER_ID = "org.tizen.nativeplatform.launch.TizenPlatformDebugger"; + public static final String COMMAND_FACTORY_ID = "org.tizen.nativeplatform.launch.PlatformCommandFactory"; + + public static final String PLATFORM_LAUNCH_ID = "org.tizen.platform.launch"; //$NON-NLS-1$ + public static final String ATTR_APP_PROJECT_NAME = PLATFORM_LAUNCH_ID + ".APP_PROJECT_ATTR"; //$NON-NLS-1$ + public static final String ATTR_EXTRA_PACKAGE_LIST = PLATFORM_LAUNCH_ID + ".EXTRA_PACKAGE_LIST_ATTR"; //$NON-NLS-1$ + public static final String ATTR_REINSTALL_OPTION = PLATFORM_LAUNCH_ID + ".REINSTALL_OP_ATTR"; //$NON-NLS-1$ + public static final String ATTR_SELECTPKG_OPTION = PLATFORM_LAUNCH_ID + ".SELECTPKG_OP_ATTR"; //$NON-NLS-1$ + public static final String ATTR_FROM_SHORTCUT = PLATFORM_LAUNCH_ID + ".FROM_SHORTCUT_ATTR"; //$NON-NLS-1$ + public static final String ATTR_PROCESSNAME_OPTION = PLATFORM_LAUNCH_ID + ".PROCESS_NAME_ATTR"; //$NON-NLS-1$ + public static final String ATTR_PROCESSID_OPTION = PLATFORM_LAUNCH_ID + ".PROCESS_ID_ATTR"; //$NON-NLS-1$ + + + + +} + \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformCommandFactory.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformCommandFactory.java new file mode 100644 index 0000000..ff0434b --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformCommandFactory.java @@ -0,0 +1,41 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; + +import java.io.IOException; + +import org.eclipse.cdt.debug.mi.core.MIProcess; +import org.eclipse.cdt.debug.mi.core.command.factories.StandardCommandFactory; +import org.eclipse.core.runtime.IProgressMonitor; + +public class PlatformCommandFactory extends StandardCommandFactory { + @Override + public MIProcess createMIProcess(String[] args, int launchTimeout, IProgressMonitor monitor) throws IOException { + return new PlatformMIProcessAdapter(args, launchTimeout, monitor); + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformMIProcessAdapter.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformMIProcessAdapter.java new file mode 100644 index 0000000..7d18672 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/PlatformMIProcessAdapter.java @@ -0,0 +1,189 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.PushbackInputStream; + +import org.eclipse.cdt.debug.mi.core.MIInferior; +import org.eclipse.cdt.debug.mi.core.MIPlugin; +import org.eclipse.cdt.debug.mi.core.MIProcessAdapter; +import org.eclipse.cdt.utils.spawner.Spawner; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; +import org.tizen.nativecommon.build.CommonProjectDependentBuilder; +import org.tizen.nativecommon.build.ProjectTypeManager; +import org.tizen.nativeplatform.util.CommandLauncher; + + +public class PlatformMIProcessAdapter extends MIProcessAdapter { + + private static final int ONE_SECOND = 1000; + + private Process gdbProcess; + InputStream gdbInputStream; + + public PlatformMIProcessAdapter(String[] args, int launchTimeout, IProgressMonitor monitor) throws IOException { + super(args, launchTimeout, monitor); + } + + public PlatformMIProcessAdapter(String[] args, IProgressMonitor monitor) throws IOException { + super(args, monitor); + } + + @Override + public boolean canInterrupt(MIInferior inferior) { + return true; + } + + @Override + public void interrupt(MIInferior inferior) { + if (gdbProcess instanceof Spawner) { + String interruptCmd = CommandLauncher.genDebugginInterruptScript(gdbProcess); + Process shellProcess; + try { + shellProcess = CommandLauncher.createProcess( interruptCmd, null, false ); + shellProcess.waitFor(); + } catch (InterruptedException e) { + e.printStackTrace(); + super.interrupt(inferior); + return; + } + + inferior.setSuspended(); + waitForInterrupt(inferior); + + //super.interrupt(inferior); + } else { + BufferedWriter bw; + bw = new BufferedWriter(new OutputStreamWriter(gdbProcess.getOutputStream())); + char c = 0x03; //standard code representing "Ctrl-C" sequence + try { + bw.write(c); + bw.newLine(); + bw.flush(); + inferior.setSuspended(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public InputStream getInputStream() { + return gdbInputStream; + } + + private IProject getProjectName(String[] args) { + String projectPathString = null; + for (int i = 0; i < args.length; i++) { + if (args[i].contains("--cd")) { + projectPathString = args[i]; + break; + } + } + String[] pathTokens = projectPathString.split("="); + projectPathString = pathTokens[pathTokens.length - 1]; + IPath projectPath = new Path(projectPathString); + String projectName = projectPath.lastSegment(); + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); + return project; + } + + @Override + protected Process getGDBProcess(String[] args, int launchTimeout, IProgressMonitor monitor) throws IOException { + + IProject project = getProjectName(args); + CommonProjectDependentBuilder builder = ProjectTypeManager.getProjectBuilderInstance(project); + + String[] newArgs = new String[args.length-1]; + System.arraycopy(args, 1, newArgs, 0, args.length-1); + + gdbProcess = builder.debug(newArgs); + +// gdbProcess = createGDBProcess(newArgs); + + Thread syncStartup = new Thread("GDB Start") { //$NON-NLS-1$ + public void run() { + PushbackInputStream pb = new PushbackInputStream(gdbProcess.getInputStream()); + gdbInputStream = pb; + try { + pb.unread(pb.read()); + } catch (IOException e) { + e.printStackTrace(); + } + // actually read something, then return it + } + }; + syncStartup.start(); + + int timepass = 0; + if (launchTimeout <= 0) { + // Simulate we are waiting forever. + launchTimeout = Integer.MAX_VALUE; + } + + // To respect the IProgressMonitor we can not use wait/notify + // instead we have to loop and check for the monitor to allow to cancel the thread. + // The monitor is check every 1 second delay; + for (timepass = 0; timepass < launchTimeout; timepass += ONE_SECOND) { + if (syncStartup.isAlive() && !monitor.isCanceled()) { + try { + Thread.sleep(ONE_SECOND); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } else { + break; + } + } + try { + syncStartup.interrupt(); + syncStartup.join(ONE_SECOND); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (monitor.isCanceled()) { + gdbProcess.destroy(); + throw new OperationCanceledException(); + } else if (timepass >= launchTimeout) { + gdbProcess.destroy(); + String message = MIPlugin.getResourceString("src.GDBDebugger.Error_launch_timeout"); //$NON-NLS-1$ + throw new IOException(message); + } + + return gdbProcess; + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegate.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegate.java index ef01062..002f619 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegate.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegate.java @@ -1,35 +1,35 @@ /* -* NativeCommon -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -39,6 +39,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.debug.core.CDIDebugModel; import org.eclipse.cdt.debug.core.ICDIDebugger2; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.ICDISession; import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; import org.eclipse.cdt.debug.mi.core.IGDBServerMILaunchConfigurationConstants; @@ -59,6 +60,7 @@ import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; @@ -73,57 +75,73 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.TwoPaneElementSelector; - +import org.tizen.common.TizenPlatformConstants; import org.tizen.common.connection.ConnectionPlugin; -import org.tizen.common.connection.debugtools.DebugTool; +import org.tizen.common.util.DialogUtil; import org.tizen.common.util.LocalPortChecker; - +import org.tizen.common.util.SWTUtil; +import org.tizen.nativecommon.build.CommonBuildMessages; import org.tizen.nativecommon.build.CommonConfigurationManager; import org.tizen.nativecommon.build.CommonProjectDependentBuilder; import org.tizen.nativecommon.build.ProjectTypeManager; import org.tizen.nativecommon.build.SmartBuildInterface; import org.tizen.nativecommon.build.exception.SBIException; import org.tizen.nativecommon.launch.TizenDebugger; +import org.tizen.nativecommon.launch.TizenLaunchCommand; import org.tizen.nativecommon.launch.TizenLaunchConfigurationConstants; import org.tizen.nativecommon.launch.TizenLaunchMessages; import org.tizen.nativecommon.launch.TizenUIThreadForConfirmMessage; import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.build.PlatformProjectPackaging; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.launch.wizards.ShowPackageStatusDialog; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; import org.tizen.sdblib.IDevice; +import org.tizen.sdblib.IDevice.Arch; +import org.tizen.sdblib.SdbCommandRejectedException; +import org.tizen.sdblib.SdbShellProcess; +import org.tizen.sdblib.TimeoutException; +@SuppressWarnings("restriction") public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { - protected static final String PACKAGE_EXTENSION = ".deb"; - protected static final String CMD_RESULT_CHECK = "; echo $?;"; - protected static final String GDBSERVER_DIR = "gdbserver"; - protected static final String GDBSERVER_BIN = "gdbserver"; protected IConfiguration selectedConfig; protected IDevice currentDevice; + protected SdbShellProcess serverProc = null; protected String executeResult = ""; - protected static final String LOCALHOST = "127.0.0.1"; - protected static final String ENVIRONMENT_SETTING_CMD = "export "; protected int localDebugPort = -1; protected ICDISession debugSession; - protected static final String ELM_SCALE_GETTER = "/home/developer/sdk_tools/elm_scale_getter/get_elm_scale "; protected static final int defaultTimeOut = 60000; + protected Shell shell; + private boolean result; + protected TizenLaunchCommand tizenCommand = null; protected String getPluginID() { return Activator.PLUGIN_ID; } - public void launch(ILaunchConfiguration config, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { + public void launch(ILaunchConfiguration config, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { + shell = LaunchUIPlugin.getShell(); if (monitor == null) monitor = new NullProgressMonitor(); try { monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION, 20); - monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION); + monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION); + + tizenCommand = new TizenLaunchCommand(currentDevice, null); activateProgressView(); verifyDeviceReachability(getProject(config), new SubProgressMonitor(monitor, 8)); verifyBuildConfiguration(config, mode, new SubProgressMonitor(monitor, 1)); + + if (!fromShortcut(config)) { + setConfigIfNotFromShortcut(config, mode, new SubProgressMonitor(monitor, 1)); + } - if (mode.equals(ILaunchManager.DEBUG_MODE)) { - verifyTizenDebianProjectSettings(config); + if (mode.equals(ILaunchManager.DEBUG_MODE)) { setDebugConfigAttributes(config); + verifyTizenDebianProjectSettings(config); setDefaultSourceLocator(launch, config); IBinaryObject exeFile = getBinaryObject(config); launchApplicationForDebug(launch, config, exeFile, new SubProgressMonitor(monitor, 10)); @@ -139,30 +157,188 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); launchManager.removeLaunch(launch); } - monitor.done(); + monitor.done(); + if (serverProc != null) { + serverProc.destroy(); + } } } + + protected void setConfigIfNotFromShortcut(ILaunchConfiguration config, String mode, IProgressMonitor monitor) + throws CoreException { + installPackages(config, mode, monitor); + } + + private boolean fromShortcut(ILaunchConfiguration config) { + boolean result = false; + try { + ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); + result = wc.getAttribute(ITizenLaunchConfigurationConstants.ATTR_FROM_SHORTCUT, false); + if (result) { + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_FROM_SHORTCUT, !result); + wc.doSave(); + } + } catch (CoreException e) { + e.printStackTrace(); + } + return result; + } protected void processPostDebug(ILaunchConfiguration config) throws CoreException { if (debugSession != null) { - try { - Process process = debugSession.getSessionProcess(); - if (process != null) - process.waitFor(); - } catch (Exception e) { - // do nothing + Process process; + try { + process = debugSession.getSessionProcess(); + } catch (CDIException e) { + e.printStackTrace(); + process = null; + } + if (process != null) { + try { + process.waitFor(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } } ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); String gdbserverPort = wc.getAttribute(TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT, TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT_DEFAULT); if (localDebugPort != -1) { - try { - currentDevice.removeForward(localDebugPort, Integer.parseInt(gdbserverPort)); - } catch (Exception e) { - // do nothing - } + try { + currentDevice.removeForward(localDebugPort, Integer.parseInt(gdbserverPort)); + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (TimeoutException e) { + e.printStackTrace(); + } catch (SdbCommandRejectedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + protected boolean packagingProject(IProject targetProj, IConfiguration config, IProgressMonitor monitor) { + boolean packagingResult = false; + + packagingResult = PlatformProjectPackaging.RPMPackaging(targetProj, config, monitor); + + if (packagingResult) { + DialogUtil.openMessageDialog(shell, CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.SUCCESS_TO_BUILD_PACKAGE); + } else { + DialogUtil.openErrorDialog(shell, CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.FAIL_TO_BUILD_PACKAGE); + } + + return packagingResult; + } + + protected void installPackages(ILaunchConfiguration config, String mode, IProgressMonitor monitor) throws CoreException { + IProject platformProject = getProject(config); + IProject appProject = null; + final PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + + boolean reinstallOp = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, true); + boolean selectPkgOp = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, true); + String appProjectName = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_APP_PROJECT_NAME, ""); + @SuppressWarnings("unchecked") + ArrayList extraPkgs = + (ArrayList) config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_EXTRA_PACKAGE_LIST, new ArrayList()); + + ArrayList appPkgs = null; + ArrayList packages = new ArrayList(); + + String buildConfigName = getBuildConfigName(config); + IConfiguration buildConfig = getBuildConfiguration(buildConfigName, platformProject); + String targetID = PlatformConfigurationManager.getBuildTargetName(buildConfig); + + final ArrayList platformPkgs = launchUtils.getProjectPackages(platformProject, buildConfigName); + if (platformPkgs.isEmpty()) { + String msg = String.format(TizenDebianLaunchMessages.QUESTION_PACKAGING, platformProject.getName()); + if (64 == DialogUtil.openQuestionDialog(msg)) { + if (packagingProject(platformProject, buildConfig, new SubProgressMonitor(monitor, 1))) { + platformPkgs.addAll(launchUtils.getProjectPackages(platformProject, buildConfigName)); + } else { + if (64 != DialogUtil.openQuestionDialog(TizenDebianLaunchMessages.QUESTION_CONTINUE)) { + newCoreException(TizenDebianLaunchMessages.CANCELED_LAUNCH, null); + } + } + } + } + + packages.addAll(platformPkgs); + + if (!appProjectName.isEmpty()) { + appProject = launchUtils.getProjectInstance(appProjectName); + appPkgs = launchUtils.getProjectPackages(appProject, buildConfigName); + + if (appPkgs.isEmpty()) { + String msg = String.format(TizenDebianLaunchMessages.QUESTION_PACKAGING, appProject.getName()); + if (64 == DialogUtil.openQuestionDialog(msg)) { + if (packagingProject(appProject, buildConfig, new SubProgressMonitor(monitor, 1))) { + appPkgs.addAll(launchUtils.getProjectPackages(appProject, buildConfigName)); + } else { + if (64 != DialogUtil.openQuestionDialog(TizenDebianLaunchMessages.QUESTION_CONTINUE)) { + newCoreException(TizenDebianLaunchMessages.CANCELED_LAUNCH, null); + } + } + } + } + + packages.addAll(appPkgs); + } + + if (!extraPkgs.isEmpty()) { + packages.addAll(launchUtils.getLocalPackages(extraPkgs)); + } + + String path = ""; + try { + path = SmartBuildInterface.getInstance().getRootstrapPath(targetID); + } catch (SBIException e) { + newCoreException(TizenDebianLaunchMessages.CANNOT_FIND_HOST_ROOTSTRAP_PATH, e); + } + + final String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(path); + + final ArrayList BuildSystemPkgs = new ArrayList(); + final ArrayList DevicePkgs = new ArrayList(); + + if (mode.equals(ILaunchManager.DEBUG_MODE)) { + launchUtils.filterBuildsystemPkgs(packages, BuildSystemPkgs, rootstrapPath, reinstallOp); } + launchUtils.filterDevicePackages(packages, DevicePkgs, currentDevice, reinstallOp); + + try { + monitor.beginTask(TizenDebianLaunchMessages.INSTALL_PACKAGE, 4); + monitor.subTask(TizenDebianLaunchMessages.CHECK_PKG_STATUS); + + if (selectPkgOp) { + if (!openPkgStatusDialog(BuildSystemPkgs, DevicePkgs)) { + newCoreException(TizenDebianLaunchMessages.CANCELED_LAUNCH, null); + } + } + + ArrayList selecteBsPkgs = launchUtils.getSelectedPackages(BuildSystemPkgs); + ArrayList selecteDvPkgs = launchUtils.getSelectedPackages(DevicePkgs); + + monitor.worked(1); + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_BUILDSYSTEM); + if (selecteBsPkgs != null && !selecteBsPkgs.isEmpty()) { + launchUtils.installPkgsToRootstrap(selecteBsPkgs, rootstrapPath, new SubProgressMonitor(monitor, 1)); + } + + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_DEVICE); + if (selecteDvPkgs != null && !selecteDvPkgs.isEmpty()) { + launchUtils.installPkgsToDevice(selecteDvPkgs, currentDevice, new SubProgressMonitor(monitor, 1)); + } + + monitor.done(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } protected void verifyTizenDebianProjectSettings(ILaunchConfiguration config) throws CoreException { @@ -179,6 +355,10 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { } protected void verifyBuildConfiguration(ILaunchConfiguration config, String mode, IProgressMonitor monitor) throws CoreException { + + monitor.beginTask("Verifying build configuration", 2); + monitor.subTask(TizenLaunchMessages.PREPARE_TO_LAUNCH); + // FIXME : Match by deviceType, not buildTargetArchitecture. IProject project = getProject(config); String buildConfigName = getBuildConfigName(config); @@ -187,13 +367,14 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { //String buildTargetArchitecture = SLPConfigurationManager.getArchitecture(configuration); //String buildTargetArchitecture = CommonConfigurationOld.getArchitecture(configuration); String buildTargetArchitecture = CommonConfigurationManager.getArchitecture(configuration); - if (currentDevice.isEmulator()) { - if(!buildTargetArchitecture.equals("i386")) + if (currentDevice.isEmulator() && currentDevice.getArch() == Arch.X86) { + if(!PlatformConfigurationManager.isEmulatorArch(buildTargetArchitecture)) resolveProblematicConfiguration(config, "i386"); } else { - if(!buildTargetArchitecture.equals("armel")) + if(!PlatformConfigurationManager.isDeviceArch(buildTargetArchitecture)) resolveProblematicConfiguration(config, "armel"); } + monitor.done(); } protected void resolveProblematicConfiguration(ILaunchConfiguration config, final String arch) throws CoreException { @@ -215,7 +396,7 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { } protected IConfiguration selectBuildConfiguration(IProject project, String arch) { - Shell shell = LaunchUIPlugin.getShell(); + Shell shell = LaunchUIPlugin.getShell(); ILabelProvider topprovider = new LabelProvider() { public String getText(Object element) { @@ -296,7 +477,7 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { protected void verifyDeviceReachability(IProject project, IProgressMonitor monitor) throws CoreException { try { - monitor.beginTask(TizenLaunchMessages.PREPARE_TO_LAUNCH, 1); + monitor.beginTask(TizenLaunchMessages.PREPARE_TO_LAUNCH, 2); monitor.subTask(TizenLaunchMessages.PREPARE_TO_LAUNCH); currentDevice = ConnectionPlugin.getDefault().getCurrentDevice(); @@ -312,23 +493,26 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { protected void launchApplicationForRun(ILaunchConfiguration config, ILaunch launch, IProgressMonitor monitor) throws CoreException { try { - monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION, 10); + monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION, 2); monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION); String envCmd = setEnvironments(config); String execArg = setArguments(config); currentDevice.executeShellCommand(envCmd + execArg); + } catch (IOException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH, e); } catch (Exception e) { newCoreException(TizenLaunchMessages.CANNOT_LAUNCH, e); } finally { + monitor.worked(1); monitor.done(); } } protected void launchApplicationForDebug(ILaunch launch, ILaunchConfiguration config, IBinaryObject exeFile, IProgressMonitor monitor) throws CoreException, OperationCanceledException { try { - monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION, 10); + monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION, 1); monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION); - launchApplicationWithGDBServer(launch, config, new SubProgressMonitor(monitor, 1)); + launchApplicationWithGDBServer(launch, config, new SubProgressMonitor(monitor, 1)); launchApplicationWithGDBClient(launch, config, exeFile, new SubProgressMonitor(monitor, 1)); } finally { monitor.done(); @@ -338,13 +522,26 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { protected void launchApplicationWithGDBServer(ILaunch launch, ILaunchConfiguration config, IProgressMonitor monitor) throws CoreException { try { monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBSERVER, 1); - monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBSERVER); - String gdbserverPort = config.getAttribute(TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT, TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT_DEFAULT); - String gdbserverCmd = DebugTool.TOOLS_TARGET_PATH + "/" + GDBSERVER_DIR + "/" + GDBSERVER_BIN + " :" + gdbserverPort; + monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBSERVER); + + IPath path = getHostPath(TizenPlatformConstants.HOST_GDBSERVER_PATH, config); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + launchUtils.readyGdbServer(currentDevice, tizenCommand, path); + + String gdbserverPort = config.getAttribute(TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT, TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT_DEFAULT); + String gdbserverCmd = TizenPlatformConstants.GDBSERVER_PLATFORM_CMD + " :" + gdbserverPort; String execArg = setArguments(config); String envCmd = setEnvironments(config); String command = envCmd + gdbserverCmd + " " + execArg; - currentDevice.executeShellCommand(command); + serverProc = currentDevice.executeShellCommand(command); + } catch (TimeoutException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); + } catch (SdbCommandRejectedException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); + } catch (CoreException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); + } catch (IOException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); } catch (Exception e) { newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); } finally { @@ -378,6 +575,10 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { "Tizen debugger", iproc, exeFile, true, false, attrDebuggerStopAtMainSymbol, true); } + } catch (DebugException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, e); + } catch (CoreException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, e); } catch (Exception e) { newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, e); } finally { @@ -388,7 +589,7 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { protected void setDebugConfigAttributes(ILaunchConfiguration config) throws CoreException { ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_REMOTE_TCP, true); - wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_HOST, LOCALHOST); + wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_HOST, TizenPlatformConstants.LOCALHOST); String gdbserverPort = wc.getAttribute(TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT, TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT_DEFAULT); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN); try { @@ -399,7 +600,15 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { String localPort = Integer.valueOf(localDebugPort).toString(); wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_PORT, localPort); wc.doSave(); - } catch (Exception e) { + } catch (TimeoutException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (SdbCommandRejectedException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (CoreException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (IOException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (NumberFormatException e) { newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); } } @@ -426,7 +635,7 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { String envs = ""; String[] envArray = getEnvironment(config); for (String env : envArray) - envs = ENVIRONMENT_SETTING_CMD + env + " && "; + envs = TizenPlatformConstants.ENVIRONMENT_SETTING_CMD + env + " && "; return envs; } @@ -501,16 +710,32 @@ public class TizenDebianLaunchDelegate extends AbstractCLaunchDelegate { CommonProjectDependentBuilder builder = ProjectTypeManager.getProjectBuilderInstance(getProject(config)); String targetID = builder.getTargetID(); - String rootstrapPath = ""; + String path = ""; try { - rootstrapPath = SmartBuildInterface.getInstance().getRootstrapPath(targetID); + path = SmartBuildInterface.getInstance().getRootstrapPath(targetID); } catch (SBIException e) { newCoreException(TizenDebianLaunchMessages.CANNOT_FIND_HOST_ROOTSTRAP_PATH, e); } + String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(path); if (!rootstrapPath.equals("")) rootstrapPath = rootstrapPath.concat(exePath); return new Path(rootstrapPath); } -} \ No newline at end of file + + protected boolean openPkgStatusDialog(final ArrayList BuildSystemPkgs, final ArrayList DevicePkgs) { + SWTUtil.syncExec(new Runnable() { + public void run() { + ShowPackageStatusDialog statusDlg = new ShowPackageStatusDialog(shell, BuildSystemPkgs, DevicePkgs); + if (Window.OK == statusDlg.open()) { + result = true; + } else { + result = false; + } + } + }); + + return result; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForAttach.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForAttach.java index 444ec90..d79d57e 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForAttach.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForAttach.java @@ -1,68 +1,72 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; +import java.io.IOException; +import java.util.ArrayList; + import org.eclipse.cdt.core.IProcessInfo; -import org.eclipse.cdt.core.IProcessList; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.mi.core.IGDBServerMILaunchConfigurationConstants; -import org.eclipse.cdt.launch.internal.ui.LaunchImages; -import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.dialogs.TwoPaneElementSelector; - -import org.tizen.common.connection.debugtools.DebugTool; -import org.tizen.nativecommon.launch.TizenDeviceProcessList; +import org.eclipse.debug.core.ILaunchManager; +import org.tizen.common.TizenPlatformConstants; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; import org.tizen.nativecommon.launch.TizenLaunchConfigurationConstants; import org.tizen.nativecommon.launch.TizenLaunchMessages; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.sdblib.SdbCommandRejectedException; +import org.tizen.sdblib.TimeoutException; public class TizenDebianLaunchDelegateForAttach extends TizenDebianLaunchDelegate { - protected Integer pid = Integer.valueOf(-1); - protected final String ATTACH_OPTION = " --attach "; + + protected Integer pid = Integer.valueOf(-1); + protected IProcessInfo procInfo = null; @Override protected void setDebugConfigAttributes(ILaunchConfiguration config) throws CoreException { ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); + + pid = wc.getAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSID_OPTION, -1); wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_REMOTE_TCP, true); - wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_HOST, LOCALHOST); + wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_HOST, TizenPlatformConstants.LOCALHOST); String gdbserverPort = wc.getAttribute(TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT, TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT_DEFAULT); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH); try { @@ -73,27 +77,52 @@ public class TizenDebianLaunchDelegateForAttach extends TizenDebianLaunchDelegat String localPort = Integer.valueOf(localDebugPort).toString(); wc.setAttribute(IGDBServerMILaunchConfigurationConstants.ATTR_PORT, localPort); wc.doSave(); - } catch (Exception e) { + } catch (TimeoutException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (SdbCommandRejectedException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (CoreException e) { + newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); + } catch (IOException e) { newCoreException(TizenLaunchMessages.CANNOT_CREATE_FORWARD, e); } } @Override + protected void setConfigIfNotFromShortcut(ILaunchConfiguration config, String mode, IProgressMonitor monitor) + throws CoreException { + setAttachProcess(config); + installPackages(config, mode, monitor); + } + + @Override protected void launchApplicationWithGDBServer(ILaunch launch, ILaunchConfiguration config, IProgressMonitor monitor) throws CoreException { try { monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBSERVER, 1); monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBSERVER); + + IPath path = getHostPath(TizenPlatformConstants.HOST_GDBSERVER_PATH, config); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + launchUtils.readyGdbServer(currentDevice, tizenCommand, path); - setPID(); - if (pid.equals(Integer.valueOf(-1)) || pid.equals(Integer.valueOf(0))) + if (pid.equals(Integer.valueOf(-1)) || pid.equals(Integer.valueOf(0))) { newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER + ICDTLaunchConfigurationConstants.ERR_NO_PROCESSID, null); + } String gdbserverPort = config.getAttribute(TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT, TizenLaunchConfigurationConstants.ATTR_GDBSERVER_PORT_DEFAULT); - String commandArguments = ":" + gdbserverPort + ATTACH_OPTION + pid; - String gdbserverCmd = DebugTool.TOOLS_TARGET_PATH + "/" + GDBSERVER_DIR + "/" + GDBSERVER_BIN + " " + commandArguments; + String commandArguments = ":" + gdbserverPort + TizenPlatformConstants.ATTACH_OPTION + pid; + String gdbserverCmd = TizenPlatformConstants.GDBSERVER_PLATFORM_CMD + " " + commandArguments; String envCmd = setEnvironments(config); String command = envCmd + gdbserverCmd; - currentDevice.executeShellCommand(command); + serverProc = currentDevice.executeShellCommand(command); + } catch (TimeoutException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); + } catch (SdbCommandRejectedException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); + } catch (CoreException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); + } catch (IOException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); } catch (Exception e) { newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER, null); } finally { @@ -101,71 +130,91 @@ public class TizenDebianLaunchDelegateForAttach extends TizenDebianLaunchDelegat } } - private void setPID() { - Display.getDefault().syncExec(new Runnable() { - public void run() { - pid = promptForProcessID(); - } - }); - } - - private Integer promptForProcessID() { - try { - return selectProcess(); - } catch (CoreException e) { - return Integer.valueOf(-1); - } - } + private void setAttachProcess(ILaunchConfiguration config) throws CoreException { + final PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + String processName = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSNAME_OPTION, ""); + + IProcessInfo procInfo = launchUtils.getProcess(shell, currentDevice, processName); + if (procInfo == null) { + newCoreException("Canceled", null); + } + + String programPath = procInfo.getName().trim(); + int pid = procInfo.getPid(); + + ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); + wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programPath); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSID_OPTION, pid); + wc.doSave(); + } - private Integer selectProcess() throws CoreException { - Shell shell = LaunchUIPlugin.getShell(); - if (shell == null) - newCoreException(TizenLaunchMessages.CANNOT_LAUNCH, null); - - ILabelProvider topprovider = new LabelProvider() { - public String getText(Object element) { - IProcessInfo pinfo = (IProcessInfo)element; - IPath ppath = new Path(pinfo.getName()); - return ppath.lastSegment() + " - " + pinfo.getPid(); //$NON-NLS-1$ - } + protected void installPackages(ILaunchConfiguration config, String mode, IProgressMonitor monitor) throws CoreException { + IProject platformProject = getProject(config); + final PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + + boolean reinstallOp = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, true); + boolean selectPkgOp = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, true); + + ArrayList packages = new ArrayList(); + + String buildConfigName = getBuildConfigName(config); + IConfiguration buildConfig = getBuildConfiguration(buildConfigName, platformProject); + String targetID = PlatformConfigurationManager.getBuildTargetName(buildConfig); + + final ArrayList platformPkgs = launchUtils.getProjectPackages(platformProject, buildConfigName); + if (platformPkgs.isEmpty()) { + String msg = String.format(TizenDebianLaunchMessages.QUESTION_PACKAGING, platformProject.getName()); + if (64 == DialogUtil.openQuestionDialog(msg)) { + if (packagingProject(platformProject, buildConfig, new SubProgressMonitor(monitor, 1))) { + platformPkgs.addAll(launchUtils.getProjectPackages(platformProject, buildConfigName)); + } else { + if (64 != DialogUtil.openQuestionDialog(TizenDebianLaunchMessages.QUESTION_CONTINUE)) { + newCoreException(TizenDebianLaunchMessages.CANCELED_LAUNCH, null); + } + } + } + } + + packages.addAll(platformPkgs); - public Image getImage(Object element) { - return LaunchImages.get(LaunchImages.IMG_OBJS_EXEC); - } - }; - - ILabelProvider downprovider = new LabelProvider() { - public String getText(Object element) { - IProcessInfo info = (IProcessInfo)element; - return info.getName(); + String path = ""; + try { + path = SmartBuildInterface.getInstance().getRootstrapPath(targetID); + } catch (SBIException e) { + newCoreException(TizenDebianLaunchMessages.CANNOT_FIND_HOST_ROOTSTRAP_PATH, e); } - - public Image getImage(Object element) { - return LaunchImages.get(LaunchImages.IMG_OBJS_EXEC); + + final String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(path); + + final ArrayList BuildSystemPkgs = new ArrayList(); + final ArrayList DevicePkgs = new ArrayList(); + + if (mode.equals(ILaunchManager.DEBUG_MODE)) { + launchUtils.filterBuildsystemPkgs(packages, BuildSystemPkgs, rootstrapPath, reinstallOp); } - }; - - TwoPaneElementSelector dlg = new TwoPaneElementSelector(shell, topprovider, downprovider); - dlg.setTitle("Select Process"); //$NON-NLS-1$ - dlg.setMessage("Select a Process to attach debugger to:"); //$NON-NLS-1$ - - IProcessList processList = null; - processList = new TizenDeviceProcessList(currentDevice); - IProcessInfo pInfos[] = null; - pInfos = processList.getProcessList(); + try { + monitor.beginTask(TizenDebianLaunchMessages.INSTALL_PACKAGE, 4); + monitor.subTask(TizenDebianLaunchMessages.CHECK_PKG_STATUS); - if(pInfos == null) - newCoreException(TizenLaunchMessages.CANNOT_LAUNCH, null); - - dlg.setElements(pInfos); - - if (dlg.open() == Window.OK) { - IProcessInfo info = (IProcessInfo)dlg.getFirstResult(); - if (info != null) - return Integer.valueOf(info.getPid()); - } - - return Integer.valueOf(-1); - } + if (selectPkgOp) { + if (!openPkgStatusDialog(BuildSystemPkgs, DevicePkgs)) { + newCoreException(TizenDebianLaunchMessages.CANCELED_LAUNCH, null); + } + } + + ArrayList selecteBsPkgs = launchUtils.getSelectedPackages(BuildSystemPkgs); + + monitor.worked(1); + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_BUILDSYSTEM); + if (selecteBsPkgs != null && !selecteBsPkgs.isEmpty()) { + launchUtils.installPkgsToRootstrap(selecteBsPkgs, rootstrapPath, new SubProgressMonitor(monitor, 1)); + } + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_DEVICE); + // Nothing to do for device + monitor.done(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForCore.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForCore.java index de15700..9bcdd81 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForCore.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchDelegateForCore.java @@ -1,31 +1,30 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; import java.io.File; @@ -48,6 +47,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; @@ -57,7 +57,7 @@ import org.eclipse.debug.core.model.IProcess; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; - +import org.tizen.common.TizenPlatformConstants; import org.tizen.common.connection.ui.TizenRemoteFileDialog; import org.tizen.common.connection.ui.TizenRemoteFileDialog.TizenRemoteFileDialogResult; import org.tizen.nativecommon.launch.TizenLaunchMessages; @@ -67,7 +67,6 @@ import org.tizen.sdblib.SyncService; import org.tizen.sdblib.SyncService.SyncResult; public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate { - protected final static String DEFAULT_CORE_DIR = "/opt/bs/core"; private FileEntry coreDir = null; @Override @@ -76,7 +75,7 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE); wc.doSave(); } - + @Override protected void launchApplicationForDebug(ILaunch launch, ILaunchConfiguration config, IBinaryObject exeFile, IProgressMonitor monitor) throws CoreException, OperationCanceledException { try { @@ -94,7 +93,7 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate try { monitor.beginTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBCLIENT, 2); monitor.subTask(TizenLaunchMessages.LAUNCH_APPLICATION_WITH_GDBCLIENT); - + ICDebugConfiguration debugConfiguration = getDebugConfig(config); String strPath = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, ""); @@ -105,13 +104,13 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, null); String projectPath = project.getLocation().toOSString(); String coreFilePath = projectPath + "/core." + project.getName(); - boolean isSuccess = false; + boolean isSuccess = false; try { isSuccess = downloadCoreFile(remotePath, coreFilePath, new SubProgressMonitor(monitor, 1)); } catch (IOException e) { newCoreException(TizenLaunchMessages.CANNOT_FIND_CORE_FILE, e); } - + if(isSuccess == false) newCoreException(TizenLaunchMessages.CANNOT_FIND_CORE_FILE, null); @@ -133,7 +132,7 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate } String appPath = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, ""); IPath hostPath = getHostPath(appPath, config); - + GDBCDIDebugger2 debugger = new GDBCDIDebugger2(); ICDISession debugSession = ((ICDIDebugger2)debugger).createSession(launch, hostPath.toFile(), new SubProgressMonitor(monitor, 1)); if(debugSession == null) @@ -154,6 +153,10 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate iproc, exeFile, true, false, "false", true); monitor.worked(1); } + } catch (DebugException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, e); + } catch (CoreException e) { + newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, e); } catch (Exception e) { newCoreException(TizenLaunchMessages.CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT, e); } finally { @@ -164,19 +167,19 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate monitor.done(); } } - + private FileEntry promptForCoreFilePath(final IProject project, ICDebugConfiguration debugConfig) throws CoreException { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); window = windows[0]; } - + final Shell shell = window.getShell(); if (shell != null) { shell.getDisplay().syncExec(new Runnable() { public void run() { - TizenRemoteFileDialog dlg = new TizenRemoteFileDialog(shell, "Select a directory where exist coredump file", currentDevice, true, DEFAULT_CORE_DIR); + TizenRemoteFileDialog dlg = new TizenRemoteFileDialog(shell, "Select a directory where exist coredump file", currentDevice, true, TizenPlatformConstants.PUBICL_PLATFORM_CORE_PATH); if (dlg.open() == TizenRemoteFileDialogResult.OK) coreDir = dlg.getSelectedFileEntry(); else @@ -217,9 +220,9 @@ public class TizenDebianLaunchDelegateForCore extends TizenDebianLaunchDelegate if (found == null) return false; - + SyncResult result = currentDevice.getSyncService().pullFile(found.getFullPath(), destFilePath, true, SyncService.getNullProgressMonitor()); - + if (result.getCode() == SyncService.RESULT_OK) return true; else diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.java index 35705c8..f65e233 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.java @@ -1,31 +1,30 @@ /* -* Native Platform -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch; import org.eclipse.osgi.util.NLS; @@ -58,4 +57,11 @@ public class TizenDebianLaunchMessages extends NLS { public static String CREATE_PACKAGE; public static String TRANSFER_PACKAGE; public static String INSTALL_PACKAGE; + public static String INSTALL_PACKAGES_TO_BUILDSYSTEM; + public static String INSTALL_PACKAGES_TO_DEVICE; + public static String CHECK_PKG_STATUS; + public static String CANCELED_LAUNCH; + public static String QUESTION_PACKAGING; + public static String QUESTION_CONTINUE; + public static String FAILED_INSTALL_PKGS; } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.properties index 831e591..431df9e 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.properties +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/TizenDebianLaunchMessages.properties @@ -1,23 +1,30 @@ -CANNOT_FIND_PROJECT_NAME = Cannot find a project name. -CANNOT_CONNECT_TO_DEVICE = Cannot connect to a device. -CANNOT_FIND_EXECUTABLE_IN_A_HOST_ROOTSTRAP = Cannot find binary file in a host rootstrap. -CANNOT_CREATE_PACKAGE = Cannot create package. -CANNOT_TRANSFER_FILE = Cannot transfer file. -CANNOT_INSTALL = Cannot install application. -CANNOT_LAUNCH = Cannot launch application. -CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER = Cannot launch application with GDBServer. -CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT = Cannot launch application with GDBClient. -BUILD_CONFIGURATION_DOES_NOT_MATCH_WITH_CURRENT_DEVICE_TYPE = Build configuration does not match with current device type. Select correct device or build configuration. -CANNOT_FIND_HOST_ROOTSTRAP_PATH = Cannot find host rootstrap path. -CANNOT_FIND_DEBIAN_CONTROL_FILE = Cannot find debian control file. -CANNOT_FIND_PACKAGE_SECTION_IN_CONTROL_FILE = Cannot find package section in control file. +CANNOT_FIND_PROJECT_NAME = Project name not found. +CANNOT_CONNECT_TO_DEVICE = Device connection failed. +CANNOT_FIND_EXECUTABLE_IN_A_HOST_ROOTSTRAP = Binary file not found in the host rootstrap. +CANNOT_CREATE_PACKAGE = Package creation failed. +CANNOT_TRANSFER_FILE = File transfer failed. +CANNOT_INSTALL = Application installation failed. +CANNOT_LAUNCH = Application launch failed. +CANNOT_LAUNCH_APPLICATION_WITH_GDBSERVER = Application launch with GDBServer failed. +CANNOT_LAUNCH_APPLICATION_WITH_GDBCLIENT = Application launch with GDBClient failed. +BUILD_CONFIGURATION_DOES_NOT_MATCH_WITH_CURRENT_DEVICE_TYPE = Build configuration does not match the current device type. Select the correct device or build configuration. +CANNOT_FIND_HOST_ROOTSTRAP_PATH = Host rootstrap path not found. +CANNOT_FIND_DEBIAN_CONTROL_FILE = Debian control file not found. +CANNOT_FIND_PACKAGE_SECTION_IN_CONTROL_FILE = Package section not found in the control file. OPERATION_CANCELED = Operation canceled. -LAUNCH_APPLICATION = Launching Application... -LAUNCH_APPLICATION_WITH_GDBSERVER = Launching application with GDBServer... -LAUNCH_APPLICATION_WITH_GDBCLIENT = Launching application with GDBClient... +LAUNCH_APPLICATION = Launching the application... +LAUNCH_APPLICATION_WITH_GDBSERVER = Launching the application with GDBServer... +LAUNCH_APPLICATION_WITH_GDBCLIENT = Launching the application with GDBClient... PREPARE_TO_LAUNCH = Preparing to launch... -START_DEPLOY_PROCESS = Start deploy process... -CREATE_PACKAGE = Creating package... -TRANSFER_PACKAGE = Transferring package... -INSTALL_PACKAGE = Installing package... +START_DEPLOY_PROCESS = Starting the deployment process... +CREATE_PACKAGE = Creating the package... +TRANSFER_PACKAGE = Transferring the package... +INSTALL_PACKAGE = Installing the package... +INSTALL_PACKAGES_TO_BUILDSYSTEM = Installing packages to buildsystem +INSTALL_PACKAGES_TO_DEVICE = Installing packages to device +CHECK_PKG_STATUS = Checking package status +CANCELED_LAUNCH = Canceled launching +QUESTION_PACKAGING = "%s" project does not have package files(*.rpm)\nDo you want packaging now ?\n +QUESTION_CONTINUE = Do you want to continue ? +FAILED_INSTALL_PKGS = Failed to install packages. See below logs \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/LaunchTabUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/LaunchTabUIMessages.properties new file mode 100644 index 0000000..d4b36e6 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/LaunchTabUIMessages.properties @@ -0,0 +1,25 @@ +AppPage.Title = Setting Tizen Application +AppPage.Desc = Please select a tizen application or add RPM files for testing +Label.AdditionPkgs = Additional Packages: +Label.App.Project = Tizen Application Project: +Label.App.Path = Tizen Application Path: +Label.Proc.Name = Attach Process: +File.Dialog.Title.File = Select RPM files + +BinPage.Title = Setting binary path +BinPage.Desc = Please set a path for test binary +Button.Browse = Remote Browse... +Button.Find = Find +Remote.Dialog.Title = Select an Application + +ProcPage.Title = Select Process +ProcPage.Desc = Please select a process for attach debugging + +PkgDialog.Title = Select packages to be installed +PkgDialog.Desc = Checked packages will be installed to buildsystem and device +PkgDialog.Label.Buildsystem = To Buildsystem: +PkgDialog.Label.Device = To Device: + + +Button.Reinstall.Op = Reinstall if the package is already present +Button.SelectPkg.Op = Select packages to be installed manually \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForAttachTabGroup.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForAttachTabGroup.java index ef937a5..852164d 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForAttachTabGroup.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForAttachTabGroup.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui; import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup; diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForCoreTabGroup.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForCoreTabGroup.java index 2ba3d04..c5a1732 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForCoreTabGroup.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationForCoreTabGroup.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui; import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup; diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationTabGroup.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationTabGroup.java index 0412fb5..18b5245 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationTabGroup.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianLaunchConfigurationTabGroup.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui; import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup; diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainAttachTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainAttachTab.java new file mode 100644 index 0000000..f5b5e2a --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainAttachTab.java @@ -0,0 +1,471 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui; + +import java.util.ArrayList; +import java.util.List; +import java.util.ResourceBundle; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.ICDescriptor; +import org.eclipse.cdt.core.IProcessInfo; +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.IBinary; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants; +import org.eclipse.cdt.launch.internal.ui.LaunchMessages; +import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; +import org.eclipse.cdt.launch.ui.CMainTab; +import org.eclipse.cdt.ui.CElementLabelProvider; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.debug.core.ILaunch; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +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.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.ElementListSelectionDialog; + +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.common.connection.ui.TizenRemoteFileDialog; +import org.tizen.common.connection.ui.TizenRemoteFileDialog.TizenRemoteFileDialogResult; +import org.tizen.common.util.ImageUtil; +import org.tizen.nativecommon.launch.TizenLaunchMessages; +import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.launch.ITizenLaunchConfigurationConstants; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; + +import org.tizen.sdblib.FileListingService.FileEntry; +import org.tizen.sdblib.IDevice; + +public class TizenDebianMainAttachTab extends CMainTab { + + private final String BUNDLE_NAME = TizenDebianMainAttachTab.class.getPackage().getName() + ".LaunchTabUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private Label fProcLabel; + private Text fProgText; + private Text fProcText; + private Button fProcButton; + private Button fReinstallOp; + private Button fSelectPkgOp; + private TableViewer tableViewer; + private boolean fSpecifyCoreFile; + private IDevice device; + private ArrayList packages = new ArrayList(); + private static final String DEFAULT_APP_PATH = "/opt/apps/"; + private String filePath = ""; + private String selectedFileList = ""; + + public TizenDebianMainAttachTab() { + this(false); + } + + public TizenDebianMainAttachTab(boolean specifyCoreFile) { + fSpecifyCoreFile = specifyCoreFile; + device = ConnectionPlugin.getDefault().getCurrentDevice(); + } + + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + setControl(comp); + + GridLayout topLayout = new GridLayout(); + comp.setLayout(topLayout); + + createVerticalSpacer(comp, 1); + createProjectGroup(comp, 1); + createProcessGroup(comp, 1); + createOptionGroupComposite(comp); + + if (fSpecifyCoreFile) + createCoreFileGroup(comp, 1); + createVerticalSpacer(comp, 1); + } + + + @Override + protected String handleBrowseButtonSelected() { + FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); + if (fProgText != null) + fileDialog.setFileName(fProgText.getText()); + else if (fCoreText != null) + fileDialog.setFileName(fCoreText.getText()); + return fileDialog.open(); + } + + private void createOptionGroupComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_END)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + + fReinstallOp = new Button(composite, SWT.CHECK); + fReinstallOp.setText(resources.getString("Button.Reinstall.Op")); + fSelectPkgOp = new Button(composite, SWT.CHECK); + fSelectPkgOp.setText(resources.getString("Button.SelectPkg.Op")); + + fReinstallOp.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + fSelectPkgOp.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + } + + private void createTableTitleComposite(Composite parent) { + Label tableLabel = new Label(parent, SWT.NONE); + tableLabel.setText(resources.getString("Label.AdditionPkgs")); + } + + private boolean existsPkg(LocalPackage pkg) { + for (LocalPackage p : packages) { + if (pkg.getPath().equals(p.getPath())) { + return true; + } + } + return false; + } + + private void createProcessGroup(Composite parent, int colSpan) { + Composite projComp = new Composite(parent, SWT.NONE); + GridLayout projLayout = new GridLayout(); + projLayout.numColumns = 2; + projLayout.marginHeight = 0; + projLayout.marginWidth = 0; + projComp.setLayout(projLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + projComp.setLayoutData(gd); + + fProcLabel = new Label(projComp, SWT.NONE); + fProcLabel.setText(resources.getString("Label.Proc.Name")); + gd = new GridData(); + gd.horizontalSpan = 2; + fProcLabel.setLayoutData(gd); + + fProcText = new Text(projComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fProcText.setLayoutData(gd); + fProcText.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent evt) { + // if project changes, invalidate program name cache + fPreviouslyCheckedProgram = null; + + updateBuildConfigCombo(""); //$NON-NLS-1$ + updateLaunchConfigurationDialog(); + } + }); + + fProcButton = createPushButton(projComp, resources.getString("Button.Find"), null); + fProcButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + IProcessInfo procInfo = launchUtils.getProcess(getShell(), device); + if (procInfo != null) { + IPath ppath = new Path(procInfo.getName()); + String name = ppath.lastSegment().trim(); + fProcText.setText(name); + updateLaunchConfigurationDialog(); + } + } + }); + } + + protected ICProject chooseCAppProject(String currentProjectName) { + + try { + ICProject[] projects = getCProjects(currentProjectName); + + ILabelProvider labelProvider = new CElementLabelProvider(); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider); + dialog.setTitle(LaunchMessages.CMainTab_Project_Selection); + dialog.setMessage(LaunchMessages.CMainTab_Choose_project_to_constrain_search_for_program); + dialog.setElements(projects); + + ICProject cProject = getCProject(); + if (cProject != null) { + dialog.setInitialSelections(new Object[] { cProject }); + } + if (dialog.open() == Window.OK) { + return (ICProject)dialog.getFirstResult(); + } + } catch (CModelException e) { + LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ + } + return null; + } + + protected ICProject[] getCProjects(String currentProjectName) throws CModelException { + ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); + ArrayList list = new ArrayList(cproject.length); + + for (int i = 0; i < cproject.length; i++) { + if (currentProjectName.length() != 0 && + cproject[i].getProject().getName().equals(currentProjectName)) { + continue; + } + ICDescriptor cdesciptor = null; + try { + cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject) cproject[i].getResource(), false); + if (cdesciptor != null) { + String projectPlatform = cdesciptor.getPlatform(); + if (filterPlatform.equals("*") //$NON-NLS-1$ + || projectPlatform.equals("*") //$NON-NLS-1$ + || filterPlatform.equalsIgnoreCase(projectPlatform) == true) { + list.add(cproject[i]); + } + } else { + list.add(cproject[i]); + } + } catch (CoreException e) { + list.add(cproject[i]); + } + } + return list.toArray(new ICProject[list.size()]); + } + + private void createExeFileField(Composite parent, int colSpan) { + Composite mainComp = new Composite(parent, SWT.NONE); + GridLayout mainLayout = new GridLayout(); + mainLayout.numColumns = 3; + mainLayout.marginHeight = 0; + mainLayout.marginWidth = 0; + mainComp.setLayout(mainLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + mainComp.setLayoutData(gd); + fProgLabel = new Label(mainComp, SWT.NONE); + fProgLabel.setText(resources.getString("Label.App.Path")); // $NON-NLS-1$ + gd = new GridData(); + gd.horizontalSpan = 3; + fProgLabel.setLayoutData(gd); + fProgText = new Text(mainComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fProgText.setLayoutData(gd); + fProgText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + Button fBrowseForBinaryButton; + fBrowseForBinaryButton = createPushButton(mainComp, resources.getString("Button.Browse"), null); //$NON-NLS-1$ + fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + handleRemoteBrowseButtonSelected(); + updateLaunchConfigurationDialog(); + } + }); + } + + protected void handleRemoteBrowseButtonSelected() { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window == null) { + IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); + window = windows[0]; + } + + final Shell shell = window.getShell(); + if (shell != null) { + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + if (device == null) { + MessageBox msgBox = new MessageBox(shell, SWT.ICON_INFORMATION); + msgBox.setMessage(TizenLaunchMessages.CANNOT_CONNECT_TO_DEVICE); + msgBox.open(); + return; + } + + shell.getDisplay().syncExec( new Runnable() { + public void run() { + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + TizenRemoteFileDialog dlg = new TizenRemoteFileDialog(shell, + resources.getString("Remote.Dialog.Title"), device, false, DEFAULT_APP_PATH); + if(dlg.open() == TizenRemoteFileDialogResult.OK) { + FileEntry selectedFile = dlg.getSelectedFileEntry(); + filePath = selectedFile.getFullPath(); + fProgText.setText(filePath); + } else + filePath = null; + } + }); + } + return; + } + + + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_AUTO_SOLIB, true); + configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_STOP_ON_SOLIB_EVENTS, false); + configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); + configuration.setAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, true); + configuration.setAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, true); + ICElement cElement = null; + cElement = getContext(configuration, getPlatform(configuration)); + if (cElement != null) + initializeCProject(cElement, configuration); + } + + @Override + public void initializeFrom(ILaunchConfiguration configuration) { + updateProjectFromConfig(configuration); + updateProcessFromConfig(configuration); + updateReinstallOpFromConfig(configuration); + updateSelectPkgOpFromConfig(configuration); + if (fSpecifyCoreFile) + updateCoreFromConfig(configuration); + } + + @Override + public boolean isValid(ILaunchConfiguration config) { + return true; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.launch.ui.CMainTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) + */ + @Override + public void performApply(ILaunchConfigurationWorkingCopy config) { + //String programPath = fProgText.getText().trim(); + String name = fProjText.getText().trim(); + String procName = fProcText.getText().trim(); + boolean reinstallOp = fReinstallOp.getSelection(); + boolean selectPkgOp = fSelectPkgOp.getSelection(); + ArrayList pkgs = new ArrayList(); + + for (LocalPackage p : packages) { + pkgs.add(p.getPath()); + } + + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, name); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSNAME_OPTION, procName); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, reinstallOp); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, selectPkgOp); + } + + @Override + protected void updateProjectFromConfig(ILaunchConfiguration config) { + String projectName = EMPTY_STRING; + try { + projectName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fProjText.setText(projectName); + } + + protected void updateProcessFromConfig(ILaunchConfiguration config) { + String procName = EMPTY_STRING; + try { + procName = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSNAME_OPTION, EMPTY_STRING); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fProcText.setText(procName); + } + + protected void updateReinstallOpFromConfig(ILaunchConfiguration config) { + boolean option = true; + try { + option = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, true); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fReinstallOp.setSelection(option); + } + + protected void updateSelectPkgOpFromConfig(ILaunchConfiguration config) { + boolean option = true; + try { + option = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, true); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fSelectPkgOp.setSelection(option); + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainCoreTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainCoreTab.java index 3aa804b..95e523a 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainCoreTab.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainCoreTab.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui; public class TizenDebianMainCoreTab extends TizenDebianMainTab { diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainTab.java index 9fab253..93fdf19 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainTab.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/TizenDebianMainTab.java @@ -1,77 +1,122 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.ICDescriptor; +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants; +import org.eclipse.cdt.launch.internal.ui.LaunchMessages; import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; import org.eclipse.cdt.launch.ui.CMainTab; +import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +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.FileDialog; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.tizen.common.connection.ConnectionPlugin; import org.tizen.common.connection.ui.TizenRemoteFileDialog; import org.tizen.common.connection.ui.TizenRemoteFileDialog.TizenRemoteFileDialogResult; +import org.tizen.common.util.ImageUtil; import org.tizen.nativecommon.launch.TizenLaunchMessages; +import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.launch.ITizenLaunchConfigurationConstants; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; import org.tizen.sdblib.FileListingService.FileEntry; import org.tizen.sdblib.IDevice; +@SuppressWarnings({ "deprecation", "restriction" }) public class TizenDebianMainTab extends CMainTab { + + private final String BUNDLE_NAME = TizenDebianMainTab.class.getPackage().getName() + ".LaunchTabUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + private Label fProgLabel; private Text fProgText; + private Text fAppProjText; + private Button fAppProjButton; + private Button fReinstallOp; + private Button fSelectPkgOp; + private TableViewer tableViewer; private boolean fSpecifyCoreFile; - private static final String LABEL_TEXT = "Tizen Application Path :"; + private ArrayList packages = new ArrayList(); private static final String DEFAULT_APP_PATH = "/opt/apps/"; - private static final String REMOTE_BROWSE = "Remote Browse..."; - private static final String SELECT_AN_APPLICATION = "Select an Application"; private String filePath = ""; + private String selectedFileList = ""; public TizenDebianMainTab() { this(false); @@ -89,14 +134,19 @@ public class TizenDebianMainTab extends CMainTab { GridLayout topLayout = new GridLayout(); comp.setLayout(topLayout); - createVerticalSpacer(comp, 1); - createExeFileField(comp, 1); + createVerticalSpacer(comp, 1); createProjectGroup(comp, 1); + createAppProjectGroup(comp, 1); + createExeFileField(comp, 1); + createExtraTableGroup(comp); + createOptionGroupComposite(comp); + if (fSpecifyCoreFile) createCoreFileGroup(comp, 1); createVerticalSpacer(comp, 1); } - + + @Override protected String handleBrowseButtonSelected() { FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); @@ -107,6 +157,286 @@ public class TizenDebianMainTab extends CMainTab { return fileDialog.open(); } + private void createOptionGroupComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + + fReinstallOp = new Button(composite, SWT.CHECK); + fReinstallOp.setText(resources.getString("Button.Reinstall.Op")); + fSelectPkgOp = new Button(composite, SWT.CHECK); + fSelectPkgOp.setText(resources.getString("Button.SelectPkg.Op")); + + fReinstallOp.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + + fSelectPkgOp.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + } + + private void createTableTitleComposite(Composite parent) { + Label tableLabel = new Label(parent, SWT.NONE); + tableLabel.setText(resources.getString("Label.AdditionPkgs")); + } + + private void createTableGroupComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + //composite.setLayout(new GridLayout(2, false)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + GridData gridData = new GridData(GridData.FILL_BOTH); + gridData.minimumHeight = 100; + gridData.minimumWidth = 300; + + composite.setLayout(gridLayout); + composite.setLayoutData(gridData); + + createTableComposite(composite); + createTableButtonComposite(composite); + } + + private void createTableComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new FillLayout()); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + tableViewer = new TableViewer(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + Table table = tableViewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + String[] columnNames = new String[] {"File Name"}; + + int[] columnWidths = new int[] {300}; + for (int i = 0; i < columnNames.length ; i++) { + TableColumn tableColumn = new TableColumn(table, SWT.LEFT); + + tableColumn.setText(columnNames[i]); + tableColumn.setWidth(columnWidths[i]); + tableColumn.setResizable(true); + tableColumn.addSelectionListener(new TooltableSelectionAdapter()); + } + + tableViewer.setLabelProvider(new TableViewerProvider()); + tableViewer.setContentProvider(new ArrayContentProvider()); + tableViewer.setInput(RootstrapManager.getRootstraps()); + tableViewer.getTable().addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + }); + + table.addListener(SWT.Dispose, tableListener); + table.addListener(SWT.KeyDown, tableListener); + table.addListener(SWT.MouseMove, tableListener); + table.addListener(SWT.MouseHover, tableListener); + } + + private void createTableButtonComposite(Composite parent) { + + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); + + Button addBt = new Button(composite, SWT.PUSH); + Image addIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/add.gif"); + addBt.setImage(addIcon); + addBt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + FileDialog fd = new FileDialog(getShell(), SWT.OPEN|SWT.MULTI); + fd.setText(resources.getString("File.Dialog.Title.File")); + String[] filterExt = { "*.rpm" }; + fd.setFilterExtensions(filterExt); + selectedFileList = fd.open(); + System.out.println(selectedFileList); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + if (selectedFileList != null) { + String[] files = fd.getFileNames(); + String path = fd.getFilterPath(); + for (String f : files) { + String filePath = new Path(path).append(f).toOSString(); + LocalPackage p = launchUtils.getLocalPackage(filePath); + if (!existsPkg(p)) { + packages.add(p); + } + } + + tableViewer.refresh(); + updateLaunchConfigurationDialog(); + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + + }); + + Button removeBt = new Button(composite, SWT.PUSH); + Image removeIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/remove.gif"); + removeBt.setImage(removeIcon); + } + + private void createExtraTableGroup(Composite parent) { + + Composite composite = new Composite(parent, SWT.NONE); + GridLayout projLayout = new GridLayout(); + projLayout.numColumns = 1; + projLayout.marginHeight = 0; + projLayout.marginWidth = 0; + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + composite.setLayout(projLayout); + composite.setLayoutData(gd); + + createTableTitleComposite(composite); + createTableGroupComposite(composite); + } + + private boolean existsPkg(LocalPackage pkg) { + for (LocalPackage p : packages) { + if (pkg.getPath().equals(p.getPath())) { + return true; + } + } + return false; + } + + private void createAppProjectGroup(Composite parent, int colSpan) { + Composite projComp = new Composite(parent, SWT.NONE); + GridLayout projLayout = new GridLayout(); + projLayout.numColumns = 2; + projLayout.marginHeight = 0; + projLayout.marginWidth = 0; + projComp.setLayout(projLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + projComp.setLayoutData(gd); + + fProjLabel = new Label(projComp, SWT.NONE); + fProjLabel.setText(resources.getString("Label.App.Project")); + gd = new GridData(); + gd.horizontalSpan = 2; + fProjLabel.setLayoutData(gd); + + fAppProjText = new Text(projComp, SWT.SINGLE | SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + fAppProjText.setLayoutData(gd); + fAppProjText.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent evt) { + // if project changes, invalidate program name cache + fPreviouslyCheckedProgram = null; + + updateBuildConfigCombo(""); //$NON-NLS-1$ + updateLaunchConfigurationDialog(); + } + }); + + fAppProjButton = createPushButton(projComp, LaunchMessages.Launch_common_Browse_1, null); + fAppProjButton.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent evt) { + handleAppProjectButtonSelected(); + updateLaunchConfigurationDialog(); + } + }); + } + + protected void handleAppProjectButtonSelected() { + String currentProjectName = fProjText.getText(); + ICProject project = chooseCAppProject(currentProjectName); + if (project == null) { + return; + } + + String projectName = project.getElementName(); + fAppProjText.setText(projectName); + } + + protected ICProject chooseCAppProject(String currentProjectName) { + + try { + ICProject[] projects = getCProjects(currentProjectName); + + ILabelProvider labelProvider = new CElementLabelProvider(); + ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider); + dialog.setTitle(LaunchMessages.CMainTab_Project_Selection); + dialog.setMessage(LaunchMessages.CMainTab_Choose_project_to_constrain_search_for_program); + dialog.setElements(projects); + + ICProject cProject = getCProject(); + if (cProject != null) { + dialog.setInitialSelections(new Object[] { cProject }); + } + if (dialog.open() == Window.OK) { + return (ICProject)dialog.getFirstResult(); + } + } catch (CModelException e) { + LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ + } + return null; + } + + protected ICProject[] getCProjects(String currentProjectName) throws CModelException { + ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); + ArrayList list = new ArrayList(cproject.length); + + for (int i = 0; i < cproject.length; i++) { + if (currentProjectName.length() != 0 && + cproject[i].getProject().getName().equals(currentProjectName)) { + continue; + } + ICDescriptor cdesciptor = null; + try { + cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject) cproject[i].getResource(), false); + if (cdesciptor != null) { + String projectPlatform = cdesciptor.getPlatform(); + if (filterPlatform.equals("*") //$NON-NLS-1$ + || projectPlatform.equals("*") //$NON-NLS-1$ + || filterPlatform.equalsIgnoreCase(projectPlatform) == true) { + list.add(cproject[i]); + } + } else { + list.add(cproject[i]); + } + } catch (CoreException e) { + list.add(cproject[i]); + } + } + return list.toArray(new ICProject[list.size()]); + } + private void createExeFileField(Composite parent, int colSpan) { Composite mainComp = new Composite(parent, SWT.NONE); GridLayout mainLayout = new GridLayout(); @@ -118,7 +448,7 @@ public class TizenDebianMainTab extends CMainTab { gd.horizontalSpan = colSpan; mainComp.setLayoutData(gd); fProgLabel = new Label(mainComp, SWT.NONE); - fProgLabel.setText(LABEL_TEXT); // $NON-NLS-1$ + fProgLabel.setText(resources.getString("Label.App.Path")); // $NON-NLS-1$ gd = new GridData(); gd.horizontalSpan = 3; fProgLabel.setLayoutData(gd); @@ -132,7 +462,7 @@ public class TizenDebianMainTab extends CMainTab { }); Button fBrowseForBinaryButton; - fBrowseForBinaryButton = createPushButton(mainComp, REMOTE_BROWSE, null); //$NON-NLS-1$ + fBrowseForBinaryButton = createPushButton(mainComp, resources.getString("Button.Browse"), null); //$NON-NLS-1$ fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent evt) { @@ -162,7 +492,8 @@ public class TizenDebianMainTab extends CMainTab { shell.getDisplay().syncExec( new Runnable() { public void run() { IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); - TizenRemoteFileDialog dlg = new TizenRemoteFileDialog(shell, SELECT_AN_APPLICATION, device, false, DEFAULT_APP_PATH); + TizenRemoteFileDialog dlg = new TizenRemoteFileDialog(shell, + resources.getString("Remote.Dialog.Title"), device, false, DEFAULT_APP_PATH); if(dlg.open() == TizenRemoteFileDialogResult.OK) { FileEntry selectedFile = dlg.getSelectedFileEntry(); filePath = selectedFile.getFullPath(); @@ -181,6 +512,8 @@ public class TizenDebianMainTab extends CMainTab { configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_AUTO_SOLIB, true); configuration.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_STOP_ON_SOLIB_EVENTS, false); configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); + configuration.setAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, true); + configuration.setAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, true); ICElement cElement = null; cElement = getContext(configuration, getPlatform(configuration)); if (cElement != null) @@ -191,54 +524,43 @@ public class TizenDebianMainTab extends CMainTab { public void initializeFrom(ILaunchConfiguration configuration) { updateProgramFromConfig(configuration); updateProjectFromConfig(configuration); + updateAppProjectFromConfig(configuration); + updateExtraTableFromConfig(configuration); + updateReinstallOpFromConfig(configuration); + updateSelectPkgOpFromConfig(configuration); if (fSpecifyCoreFile) updateCoreFromConfig(configuration); } @Override public boolean isValid(ILaunchConfiguration config) { - setErrorMessage(null); - setMessage(null); - + return true; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.launch.ui.CMainTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) + */ + @Override + public void performApply(ILaunchConfigurationWorkingCopy config) { + String programPath = fProgText.getText().trim(); String name = fProjText.getText().trim(); - if (name.length() == 0) { - setErrorMessage(TizenLaunchMessages.TizenMainTab_Project_not_specified); - return false; - } - if (!ResourcesPlugin.getWorkspace().getRoot().getProject(name).exists()) { - setErrorMessage(TizenLaunchMessages.Launch_common_Project_does_not_exist); - return false; - } - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name); - if (!project.isOpen()) { - setErrorMessage(TizenLaunchMessages.TizenMainTab_Project_must_be_opened); - return false; - } - - if (fProgText != null) - name = fProgText.getText().trim(); + String appProj = fAppProjText.getText().trim(); + boolean reinstallOp = fReinstallOp.getSelection(); + boolean selectPkgOp = fSelectPkgOp.getSelection(); + ArrayList pkgs = new ArrayList(); - if (name.length() == 0) { - setErrorMessage(TizenLaunchMessages.TizenMainTab_Program_not_specified); - return false; - } - if (name.equals(".") || name.equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$ - setErrorMessage(TizenLaunchMessages.TizenMainTab_Program_does_not_exist); - return false; - } - - //FIXME:: For enabling apply button. but the button is enabled when change more than 2 characters. - try { - ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy(); - wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, name); - wc.doSave(); - } catch (CoreException ce) { - LaunchUIPlugin.log(ce); - } + for (LocalPackage p : packages) { + pkgs.add(p.getPath()); + } - return true; + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programPath); + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, name); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_APP_PROJECT_NAME, appProj); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_EXTRA_PACKAGE_LIST, pkgs); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, reinstallOp); + config.setAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, selectPkgOp); } - + @Override protected void updateProjectFromConfig(ILaunchConfiguration config) { String projectName = EMPTY_STRING; @@ -254,8 +576,9 @@ public class TizenDebianMainTab extends CMainTab { protected void updateProgramFromConfig(ILaunchConfiguration config) { if (fProgText != null) { - String programName = EMPTY_STRING; + String programName = EMPTY_STRING; try { + programName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EMPTY_STRING); } catch (CoreException ce) { LaunchUIPlugin.log(ce); @@ -263,4 +586,182 @@ public class TizenDebianMainTab extends CMainTab { fProgText.setText(programName); } } + + protected void updateAppProjectFromConfig(ILaunchConfiguration config) { + String projectName = EMPTY_STRING; + try { + projectName = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_APP_PROJECT_NAME, EMPTY_STRING); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fAppProjText.setText(projectName); + } + + @SuppressWarnings("unchecked") + protected void updateExtraTableFromConfig(ILaunchConfiguration config) { + ArrayList pkgs = null; + try { + pkgs = (ArrayList) config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_EXTRA_PACKAGE_LIST, new ArrayList()); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + //packages.addAll(launchUtils.getLocalPackages(pkgs)); + packages = launchUtils.getLocalPackages(pkgs); + tableViewer.setInput(packages); + } + + protected void updateReinstallOpFromConfig(ILaunchConfiguration config) { + boolean option = true; + try { + option = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, true); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fReinstallOp.setSelection(option); + } + + protected void updateSelectPkgOpFromConfig(ILaunchConfiguration config) { + boolean option = true; + try { + option = config.getAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, true); + } catch (CoreException ce) { + LaunchUIPlugin.log(ce); + } + fSelectPkgOp.setSelection(option); + } + + private class TooltableSelectionAdapter extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) { + + final int column = tableViewer.getTable().indexOf((TableColumn) e.widget); + tableViewer.getTable().setSortColumn((TableColumn)e.widget); + if (tableViewer.getTable().getSortDirection() == SWT.DOWN) { + tableViewer.getTable().setSortDirection(SWT.UP); + } else { + tableViewer.getTable().setSortDirection(SWT.DOWN); + } + + tableViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + LocalPackage pkg_1 = (LocalPackage)e1; + LocalPackage pkg_2 = (LocalPackage)e2; + + String fileName_1 = new Path(pkg_1.getPath()).lastSegment(); + String fileName_2 = new Path(pkg_2.getPath()).lastSegment(); + + switch (column) { + case 1: + if (tableViewer.getTable().getSortDirection() == SWT.DOWN) { + return fileName_1.compareTo(fileName_2); + } else { + return fileName_2.compareTo(fileName_1); + } + default: + break; + } + return fileName_1.compareTo(fileName_2); + } + }); + + } + } + + /* selected package table provider */ + private class TableViewerProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + @Override + public String getColumnText(Object element, int columnIndex) { + if ( element instanceof LocalPackage) { + LocalPackage pkg = (LocalPackage)element; + String file = pkg.getPath(); + String name = new Path(file).lastSegment(); + + switch(columnIndex) { + case 0 : + return name; + default: + break; + } + } + return null; + } + } + + Listener tableListener = new Listener() { + Shell tip = null; + Label label = null; + + public void handleEvent(Event event) { + switch (event.type) { + case SWT.Dispose: + case SWT.KeyDown: + case SWT.MouseMove: { + if (tip == null) { + break; + } + tip.dispose(); + tip = null; + label = null; + break; + } + case SWT.MouseHover: { + TableItem item = tableViewer.getTable().getItem(new Point(event.x, event.y)); + if (item != null) { + if (tip != null && !tip.isDisposed()) { + tip.dispose(); + } + tip = new Shell(getShell(), SWT.ON_TOP | SWT.TOOL); + tip.setLayout(new FillLayout()); + label = new Label(tip, SWT.NONE); + LocalPackage pkg = (LocalPackage)item.getData(); + + label.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + label.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + + label.setData("_TABLEITEM", item); + label.setText(pkg.getPath()); + label.addListener(SWT.MouseExit, labelListener); + label.addListener(SWT.MouseDown, labelListener); + Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT); + Rectangle rect = item.getBounds(0); + Point pt = tableViewer.getTable().toDisplay(rect.x, rect.y); + tip.setBounds(pt.x + 50, pt.y + 10, size.x, size.y); + tip.setVisible(true); + } + } + default: + break; + } + } + }; + + // Implement a "fake" tooltip + final Listener labelListener = new Listener() { + public void handleEvent(Event event) { + Label label = (Label) event.widget; + Shell shell = label.getShell(); + switch (event.type) { + case SWT.MouseDown: + Event e = new Event(); + e.item = (TableItem) label.getData("_TABLEITEM"); + // Assuming table is single select, set the selection as if + // the mouse down event went through to the table + tableViewer.getTable().setSelection(new TableItem[] { (TableItem) e.item }); + tableViewer.getTable().notifyListeners(SWT.Selection, e); + // fall through + case SWT.MouseExit: + shell.dispose(); + break; + default: + break; + } + } + }; } \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectAttachLaunchShortcut.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectAttachLaunchShortcut.java index 45891f5..2ef0070 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectAttachLaunchShortcut.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectAttachLaunchShortcut.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui.shortcut; import java.util.ArrayList; @@ -38,19 +37,28 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.core.ICDebugConfiguration; +import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer; +import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer; import org.eclipse.cdt.debug.internal.ui.launch.CApplicationLaunchShortcut; import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.ICDebuggerPage; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.core.model.ISourceLocator; +import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector; +import org.eclipse.debug.core.sourcelookup.ISourceContainer; +import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector; +import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; @@ -62,16 +70,29 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; +import org.tizen.nativecommon.build.SmartBuildInterface; import org.tizen.nativecommon.launch.TizenLaunchConfigurationConstants; -import org.tizen.nativeplatform.Activator; -import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.launch.ITizenLaunchConfigurationConstants; +import org.tizen.nativeplatform.launch.wizards.PlatformAttachLaunchWizard; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchWizardDialog; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; +@SuppressWarnings("restriction") public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchShortcut { - private static final String APPLICATION_PATH_INPUT_DIALOG_TITLE = "Input Tizen Application Path"; - private static final String APPLICATION_PATH_INPUT_DIALOG_TEXT = "Input Tizen Application Path : "; + + private String programPath = null; + private boolean reinstallOp = true; + private boolean selectPkgOp = true; + private String procName = ""; + private int pid; + + private ISourceLookupDirector fLocator; public void launch(IProject project, String mode) { searchAndLaunch(new Object[] {project}, mode); @@ -133,11 +154,9 @@ public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchSh if ( debugConfig == null ) { // Prompt the user if more then 1 debugger. - String os = Platform.getOS(); debugConfigs = CDebugCorePlugin.getDefault().getActiveDebugConfigurations(); List debugList = new ArrayList(debugConfigs.length); for (int i = 0; i < debugConfigs.length; i++) { - String platform = debugConfigs[i].getPlatform(); if (debugConfigs[i].supportsMode(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN)) { if (debugConfigs[i].getName().contains("Tizen")) //$NON-NLS-1$ debugList.add(debugConfigs[i]); @@ -182,13 +201,20 @@ public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchSh protected ILaunchConfiguration createConfiguration(IProject project, ICDebugConfiguration debugConfig, String mode) { ILaunchConfiguration config = null; try { - String projectName = project.getProjectRelativePath().toString(); ILaunchConfigurationType configType = getCLaunchConfigType(); ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, getLaunchManager().generateLaunchConfigurationName(project.getName())); - String programName = getProgramName(); - if (programName != null) - wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programName); + + if (!setLaunchConfiguration(project, mode)) { + return null; + } + + wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programPath); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, reinstallOp); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, selectPkgOp); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSNAME_OPTION, procName); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_PROCESSID_OPTION, pid); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_FROM_SHORTCUT, true); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName()); wc.setMappedResources(new IResource[] {project}); @@ -196,7 +222,7 @@ public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchSh wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ID, TizenLaunchConfigurationConstants.DEBUGGER_ID); - wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, TizenLaunchConfigurationConstants.COMMAND_FACTORY_ID); + wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, ITizenLaunchConfigurationConstants.COMMAND_FACTORY_ID); wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_AUTO_SOLIB, true); wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_STOP_ON_SOLIB_EVENTS, false); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); @@ -211,6 +237,7 @@ public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchSh // Load up the debugger page to set the defaults. There should probably be a separate // extension point for this. ICDebuggerPage page = CDebugUIPlugin.getDefault().getDebuggerPage(debugConfig.getID()); + setSourceContainer(project, wc); page.setDefaults(wc); config = wc.doSave(); @@ -220,7 +247,10 @@ public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchSh return config; } - private String getProgramName() throws CoreException { + private boolean setLaunchConfiguration(IProject project, String mode) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo( project ) ; + IConfiguration defaultConfig = info.getDefaultConfiguration(); + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); @@ -228,23 +258,108 @@ public class TizenDebianProjectAttachLaunchShortcut extends CApplicationLaunchSh } final Shell shell = window.getShell(); - TizenPathInputDialog dlg = new TizenPathInputDialog(shell, - APPLICATION_PATH_INPUT_DIALOG_TITLE, - APPLICATION_PATH_INPUT_DIALOG_TEXT, - null); - if (Window.OK == dlg.open()) - return dlg.getValue(); - else - newCoreException(TizenDebianLaunchMessages.OPERATION_CANCELED, null); - - return null; + PlatformAttachLaunchWizard wizard = new PlatformAttachLaunchWizard(shell, project, defaultConfig, mode); + PlatformLaunchWizardDialog dlg = new PlatformLaunchWizardDialog(shell, wizard); + dlg.create(); + if (Window.OK == dlg.open()) { + programPath = dlg.getProgramPath(); + reinstallOp = dlg.getReinstallOp(); + selectPkgOp = dlg.getSelectPkgOp(); + procName = dlg.getProcName(); + pid = dlg.getProcId(); + return true; + } else { + return false; + } } - private void newCoreException(String message, Throwable exception) throws CoreException { - Status status = new Status(Status.ERROR, Activator.PLUGIN_ID, message, exception); - throw new CoreException(status); + private void setSourceContainer(IProject project, ILaunchConfigurationWorkingCopy configuration) { + + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo( project ) ; + IConfiguration config = info.getDefaultConfiguration(); + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + String rootId = SmartBuildInterface.getInstance().getRootstrapIDFromTargetID(targetId); + PlatformRootstrap rootstrap = RootstrapManager.getRootstrap(rootId); + + String basePath = rootstrap.getPath().toOSString(); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(basePath); + DirectorySourceContainer container = new DirectorySourceContainer(new Path(rootstrapPath), true); + MappingSourceContainer mappingContainer = new MappingSourceContainer("Source mapping"); + MapEntrySourceContainer entry = new MapEntrySourceContainer(); + String[] infos = launchUtils.getProjectInfo(project); + String backend = String.format("/usr/src/debug/%s-%s", infos[0], infos[1]); + String local = project.getLocation().toOSString(); + + entry.setBackendPath(new Path(backend)); + entry.setLocalPath(new Path(local)); + mappingContainer.addMapEntry(entry); + + if (fLocator != null) { + fLocator.dispose(); + fLocator = null; + } + + String memento = null; + String type = null; + try{ + memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null); + type = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null); + if (type == null) { + type = configuration.getType().getSourceLocatorId(); + } + } catch(CoreException e){ + return; + } + + if(type == null) { + return; + } + + try { + ISourceLocator locator = getLaunchManager().newSourceLocator(type); + if(!(locator instanceof AbstractSourceLookupDirector)) { + // migrate to the new source lookup infrastructure + memento = null; // don't use old memento + type = configuration.getType().getSourceLocatorId(); + if(type == null) { + return; + } + locator = getLaunchManager().newSourceLocator(type); + if (!(locator instanceof AbstractSourceLookupDirector)) { + return; + } + } + fLocator = (AbstractSourceLookupDirector)locator; + if (memento == null) { + fLocator.initializeDefaults(configuration); + } else { + fLocator.initializeFromMemento(memento, configuration); + } + } catch (CoreException e) { + return; + } + + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null); + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null); + + int length = fLocator.getSourceContainers().length; + ISourceContainer[] containers = new ISourceContainer[length + 2]; + containers[0] = mappingContainer; + containers[1] = container; + containers[2] = fLocator.getSourceContainers()[0]; + + fLocator.setSourceContainers(containers); + + try { + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, fLocator.getMemento()); + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, fLocator.getId()); + } catch (CoreException e) { + e.printStackTrace(); + } } + @Override protected ILaunchConfigurationType getCLaunchConfigType() { return getLaunchManager().getLaunchConfigurationType("org.tizen.nativeplatform.launch.TizenDebianLaunchConfigurationTypeForAttach"); diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectCoredumpLaunchShortcut.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectCoredumpLaunchShortcut.java index f9f594e..103cfff 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectCoredumpLaunchShortcut.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectCoredumpLaunchShortcut.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui.shortcut; import java.util.ArrayList; @@ -46,7 +45,6 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; @@ -64,11 +62,13 @@ import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.tizen.nativecommon.launch.TizenLaunchConfigurationConstants; import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.launch.ITizenLaunchConfigurationConstants; import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; +@SuppressWarnings("restriction") public class TizenDebianProjectCoredumpLaunchShortcut extends CApplicationLaunchShortcut { private static final String APPLICATION_PATH_INPUT_DIALOG_TITLE = "Input Tizen Application Path"; private static final String APPLICATION_PATH_INPUT_DIALOG_TEXT = "Input Tizen Application Path : "; @@ -133,11 +133,9 @@ public class TizenDebianProjectCoredumpLaunchShortcut extends CApplicationLaunch if ( debugConfig == null ) { // Prompt the user if more then 1 debugger. - String os = Platform.getOS(); debugConfigs = CDebugCorePlugin.getDefault().getActiveDebugConfigurations(); List debugList = new ArrayList(debugConfigs.length); for (int i = 0; i < debugConfigs.length; i++) { - String platform = debugConfigs[i].getPlatform(); if (debugConfigs[i].supportsMode(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN)) { if (debugConfigs[i].getName().contains("Tizen")) //$NON-NLS-1$ debugList.add(debugConfigs[i]); @@ -182,7 +180,6 @@ public class TizenDebianProjectCoredumpLaunchShortcut extends CApplicationLaunch protected ILaunchConfiguration createConfiguration(IProject project, ICDebugConfiguration debugConfig, String mode) { ILaunchConfiguration config = null; try { - String projectName = project.getProjectRelativePath().toString(); ILaunchConfigurationType configType = getCLaunchConfigType(); ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, getLaunchManager().generateLaunchConfigurationName(project.getName())); @@ -196,7 +193,7 @@ public class TizenDebianProjectCoredumpLaunchShortcut extends CApplicationLaunch wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ID, TizenLaunchConfigurationConstants.DEBUGGER_ID); - wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, TizenLaunchConfigurationConstants.COMMAND_FACTORY_ID); + wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, ITizenLaunchConfigurationConstants.COMMAND_FACTORY_ID); wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_AUTO_SOLIB, true); wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_STOP_ON_SOLIB_EVENTS, false); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectLaunchShortcut.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectLaunchShortcut.java index ee1847f..d84b87e 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectLaunchShortcut.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianProjectLaunchShortcut.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui.shortcut; import java.util.ArrayList; @@ -42,15 +41,24 @@ import org.eclipse.cdt.debug.internal.ui.launch.CApplicationLaunchShortcut; import org.eclipse.cdt.debug.mi.core.IMILaunchConfigurationConstants; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.ICDebuggerPage; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer; +import org.eclipse.debug.core.model.ISourceLocator; +import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector; +import org.eclipse.debug.core.sourcelookup.ISourceContainer; +import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector; +import org.eclipse.cdt.debug.core.sourcelookup.MappingSourceContainer; +import org.eclipse.cdt.debug.internal.core.sourcelookup.MapEntrySourceContainer; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; @@ -62,16 +70,33 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativecommon.build.SmartBuildInterface; import org.tizen.nativecommon.launch.TizenLaunchConfigurationConstants; -import org.tizen.nativeplatform.Activator; -import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; - - - +import org.tizen.nativecommon.launch.TizenLaunchMessages; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.launch.ITizenLaunchConfigurationConstants; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchWizard; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchWizardDialog; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; +import org.tizen.sdblib.IDevice; +@SuppressWarnings("restriction") public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut { - private static final String APPLICATION_PATH_INPUT_DIALOG_TITLE = "Input Tizen Application Path"; - private static final String APPLICATION_PATH_INPUT_DIALOG_TEXT = "Input Tizen Application Path : "; + + private static final String APP_PROJ_DEFAULT_SELECTION = "[Not required]"; + + private String programPath = null; + private String appProjectName = null; + private ArrayList packages = null; + private boolean reinstallOp = true; + private boolean selectPkgOp = true; + + private ISourceLookupDirector fLocator; public void launch(IProject project, String mode) { searchAndLaunch(new Object[] {project}, mode); @@ -90,6 +115,12 @@ public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut } private void searchAndLaunch(final Object[] elements, String mode) { + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + if (device == null) { + DialogUtil.openErrorDialog(TizenLaunchMessages.CANNOT_CONNECT_TO_DEVICE); + return; + } + if (elements != null && elements.length > 0) { int nElements = elements.length; for (int i = 0; i < nElements; i++) { @@ -133,11 +164,9 @@ public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut if ( debugConfig == null ) { // Prompt the user if more then 1 debugger. - String os = Platform.getOS(); debugConfigs = CDebugCorePlugin.getDefault().getActiveDebugConfigurations(); List debugList = new ArrayList(debugConfigs.length); for (int i = 0; i < debugConfigs.length; i++) { - String platform = debugConfigs[i].getPlatform(); if (debugConfigs[i].supportsMode(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN)) { if (debugConfigs[i].getName().contains("Tizen")) //$NON-NLS-1$ debugList.add(debugConfigs[i]); @@ -180,23 +209,43 @@ public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut } protected ILaunchConfiguration createConfiguration(IProject project, ICDebugConfiguration debugConfig, String mode) { + ILaunchConfiguration config = null; try { - String projectName = project.getProjectRelativePath().toString(); ILaunchConfigurationType configType = getCLaunchConfigType(); ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, getLaunchManager().generateLaunchConfigurationName(project.getName())); - String programName = getProgramName(); - if (programName != null) - wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programName); + if (!setLaunchConfiguration(project, mode)) { + return null; + } + + if (programPath != null) { + wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programPath); + } + + if (appProjectName != null && !APP_PROJ_DEFAULT_SELECTION.equals(appProjectName)) { + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_APP_PROJECT_NAME, appProjectName); + } + + if (packages != null) { + ArrayList strs = new ArrayList(); + for (LocalPackage p : packages) { + strs.add(p.getPath()); + } + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_EXTRA_PACKAGE_LIST, strs); + } + + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_REINSTALL_OPTION, reinstallOp); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_SELECTPKG_OPTION, selectPkgOp); + wc.setAttribute(ITizenLaunchConfigurationConstants.ATTR_FROM_SHORTCUT, true); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName()); wc.setMappedResources(new IResource[] {project}); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String) null); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ID, TizenLaunchConfigurationConstants.DEBUGGER_ID); - wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, TizenLaunchConfigurationConstants.COMMAND_FACTORY_ID); + wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_COMMAND_FACTORY, ITizenLaunchConfigurationConstants.COMMAND_FACTORY_ID); wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_AUTO_SOLIB, true); wc.setAttribute(IMILaunchConfigurationConstants.ATTR_DEBUGGER_STOP_ON_SOLIB_EVENTS, false); wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_BUILD_BEFORE_LAUNCH, ICDTLaunchConfigurationConstants.BUILD_BEFORE_LAUNCH_DISABLED); @@ -210,6 +259,7 @@ public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut // Load up the debugger page to set the defaults. There should probably be a separate // extension point for this. ICDebuggerPage page = CDebugUIPlugin.getDefault().getDebuggerPage(debugConfig.getID()); + setSourceContainer(project, wc); page.setDefaults(wc); config = wc.doSave(); @@ -219,7 +269,16 @@ public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut return config; } - private String getProgramName() throws CoreException { + @Override + protected ILaunchConfigurationType getCLaunchConfigType() { + return getLaunchManager().getLaunchConfigurationType("org.tizen.nativeplatform.launch.TizenDebianLaunchConfigurationType"); + } + + + private boolean setLaunchConfiguration(IProject project, String mode) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo( project ) ; + IConfiguration defaultConfig = info.getDefaultConfiguration(); + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); @@ -227,25 +286,105 @@ public class TizenDebianProjectLaunchShortcut extends CApplicationLaunchShortcut } final Shell shell = window.getShell(); - TizenPathInputDialog dlg = new TizenPathInputDialog(shell, - APPLICATION_PATH_INPUT_DIALOG_TITLE, - APPLICATION_PATH_INPUT_DIALOG_TEXT, - null); - if (Window.OK == dlg.open()) - return dlg.getValue(); - else - newCoreException(TizenDebianLaunchMessages.OPERATION_CANCELED, null); - - return null; - } - - private void newCoreException(String message, Throwable exception) throws CoreException { - Status status = new Status(Status.ERROR, Activator.PLUGIN_ID, message, exception); - throw new CoreException(status); + PlatformLaunchWizard wizard = new PlatformLaunchWizard(shell, project, defaultConfig, mode); + PlatformLaunchWizardDialog dlg = new PlatformLaunchWizardDialog(shell, wizard); + dlg.create(); + if (Window.OK == dlg.open()) { + appProjectName = dlg.getAppProjectName(); + programPath = dlg.getProgramPath(); + packages = dlg.getExtraPackages(); + reinstallOp = dlg.getReinstallOp(); + selectPkgOp = dlg.getSelectPkgOp(); + return true; + } else { + return false; + } } - @Override - protected ILaunchConfigurationType getCLaunchConfigType() { - return getLaunchManager().getLaunchConfigurationType("org.tizen.nativeplatform.launch.TizenDebianLaunchConfigurationType"); + private void setSourceContainer(IProject project, ILaunchConfigurationWorkingCopy configuration) { + + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo( project ) ; + IConfiguration config = info.getDefaultConfiguration(); + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + String rootId = SmartBuildInterface.getInstance().getRootstrapIDFromTargetID(targetId); + PlatformRootstrap rootstrap = RootstrapManager.getRootstrap(rootId); + + String basePath = rootstrap.getPath().toOSString(); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(basePath); + DirectorySourceContainer container = new DirectorySourceContainer(new Path(rootstrapPath), true); + MappingSourceContainer mappingContainer = new MappingSourceContainer("Source mapping"); + MapEntrySourceContainer entry = new MapEntrySourceContainer(); + String[] infos = launchUtils.getProjectInfo(project); + String backend = String.format("/usr/src/debug/%s-%s", infos[0], infos[1]); + String local = project.getLocation().toOSString(); + + entry.setBackendPath(new Path(backend)); + entry.setLocalPath(new Path(local)); + mappingContainer.addMapEntry(entry); + + if (fLocator != null) { + fLocator.dispose(); + fLocator = null; + } + + String memento = null; + String type = null; + try{ + memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null); + type = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null); + if (type == null) { + type = configuration.getType().getSourceLocatorId(); + } + } catch(CoreException e){ + return; + } + + if(type == null) { + return; + } + + try { + ISourceLocator locator = getLaunchManager().newSourceLocator(type); + if(!(locator instanceof AbstractSourceLookupDirector)) { + // migrate to the new source lookup infrastructure + memento = null; // don't use old memento + type = configuration.getType().getSourceLocatorId(); + if(type == null) { + return; + } + locator = getLaunchManager().newSourceLocator(type); + if (!(locator instanceof AbstractSourceLookupDirector)) { + return; + } + } + fLocator = (AbstractSourceLookupDirector)locator; + if (memento == null) { + fLocator.initializeDefaults(configuration); + } else { + fLocator.initializeFromMemento(memento, configuration); + } + } catch (CoreException e) { + return; + } + + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String)null); + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, (String)null); + + int length = fLocator.getSourceContainers().length; + ISourceContainer[] containers = new ISourceContainer[length + 2]; + containers[0] = mappingContainer; + containers[1] = container; + containers[2] = fLocator.getSourceContainers()[0]; + + fLocator.setSourceContainers(containers); + + try { + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, fLocator.getMemento()); + configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, fLocator.getId()); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianPropertyTester.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianPropertyTester.java index 8d72e61..264d8cb 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianPropertyTester.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenDebianPropertyTester.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui.shortcut; import org.eclipse.cdt.managedbuilder.core.IConfiguration; @@ -37,38 +36,44 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.tizen.nativeplatform.build.PlatformConfigurationManager; - - - +/** + * + * @deprecated It is not used anymore (commented out in plugin.xml). + */ +@Deprecated public class TizenDebianPropertyTester extends PropertyTester { - @Override - public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { - if ("isTizenCustomDebianProject".equals(property)) { - if (receiver instanceof IProject) { - IProject project = (IProject)receiver; - return testProject(project); - } - } else if ("belongTizenCustomDebianProject".equals(property)) { - if (receiver instanceof IResource) { - IResource r = (IResource)receiver; - IProject project = r.getProject(); - return testProject(project); - } - } - return false; - } - - private boolean testProject(IProject project) { - IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); - if (info == null) - return false; - IConfiguration cfg = info.getDefaultConfiguration(); - IManagedProject managedProject = cfg.getManagedProject(); - String projectArtifactType = managedProject.getProjectType().getBuildArtefactType().getId(); - if (projectArtifactType.equals(PlatformConfigurationManager.TIZEN_CUSTOM_DEBIAN_ARTIFACT_TYPE) || - projectArtifactType.equals(PlatformConfigurationManager.OLD_SLP_CUSTOM_DEBIAN_ARTIFACT_TYPE)) - return true; - else - return false; - } -} \ No newline at end of file + @Override + public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { + if ("isTizenCustomDebianProject".equals(property)) { + if (receiver instanceof IProject) { + IProject project = (IProject)receiver; + return testProject(project); + } + } else if ("belongTizenCustomDebianProject".equals(property)) { + if (receiver instanceof IResource) { + IResource r = (IResource)receiver; + IProject project = r.getProject(); + return testProject(project); + } + } + return false; + } + + private boolean testProject(IProject project) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + if (info == null) + return false; + IConfiguration cfg = info.getDefaultConfiguration(); + IManagedProject managedProject = cfg.getManagedProject(); + if (managedProject != null && managedProject.getProjectType() != null) { + String projectArtifactType = managedProject.getProjectType().getBuildArtefactType().getId(); + if (projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE) || + projectArtifactType.equals(PlatformConfigurationManager.OLD_SLP_CUSTOM_DEBIAN_ARTIFACT_TYPE)) + return true; + else + return false; + } else { + return false; + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenPathInputDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenPathInputDialog.java index b790439..6f456c7 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenPathInputDialog.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/ui/shortcut/TizenPathInputDialog.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.ui.shortcut; import org.eclipse.jface.dialogs.Dialog; diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/LaunchWizardPageUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/LaunchWizardPageUIMessages.properties new file mode 100644 index 0000000..ad532e9 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/LaunchWizardPageUIMessages.properties @@ -0,0 +1,25 @@ +AppPage.Title = Setting Tizen Application +AppPage.Desc = Please select a tizen application or add RPM files for testing +AppPage.Label.AdditionPkgs = Additional Packages: +AppPage.Label.Project = Tizen Application Project: +AppPage.Dialog.Title.File = Select RPM files + +BinPage.Title = Setting binary path +BinPage.Desc = Please set a path for test binary +BinPage.Button.Browse = Remote Browse... +BinPage.Remote.Dialog.Title = Select an Application + +ProcPage.Title = Select Process +ProcPage.Desc = Please select a process for attach debugging +ProcPage.Label.ProcName = Process: +ProcPage.Label.ProcPath = Path: +ProcPage.Button.Browse = Browse + +PkgDialog.Title = Select packages to be installed +PkgDialog.Desc = Checked packages will be installed to buildsystem and device +PkgDialog.Label.Buildsystem = To Buildsystem: +PkgDialog.Label.Device = To Device: + + +Button.Reinstall.Op = Reinstall if the package is already present +Button.SelectPkg.Op = Select packages to be installed manually \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingAppPage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingAppPage.java new file mode 100644 index 0000000..5e16afa --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingAppPage.java @@ -0,0 +1,579 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizard.pages; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.ResourceBundle; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +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.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; + +import org.tizen.common.util.DialogUtil; +import org.tizen.common.util.ImageUtil; +import org.tizen.nativecommon.build.CommonBuildMessages; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.build.PlatformProjectPackaging; +import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; + +public class PlatformLaunchSettingAppPage extends WizardPage { + + private final String BUNDLE_NAME = PlatformLaunchSettingAppPage.class.getPackage().getName() + ".LaunchWizardPageUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private TableViewer tableViewer; + private FileDialog fd; + private Combo projectCombo; + private Button reinstallOp; + private Button selectPkgOp; + private String selectedFileList = ""; + private Shell shell; + + private IConfiguration config; + private IProject platformProject; + private PlatformRootstrap rootstrap; + private String rootPath = ""; + private boolean packagingResult; + private ArrayList platformPackages = new ArrayList(); + private ArrayList appPackages = new ArrayList(); + private ArrayList extraPackages = new ArrayList(); + private ArrayList packages = new ArrayList(); + private ArrayList projectNames = new ArrayList(); + private HashMap projectMap = new HashMap(); + + private static final String APP_PROJ_DEFAULT_SELECTION = "[Not required]"; + + public PlatformLaunchSettingAppPage(Shell shell, String pageName, IProject project, IConfiguration config) { + super(pageName); + + setTitle(resources.getString("AppPage.Title")); + setDescription(resources.getString("AppPage.Desc")); + setPageComplete(true); + + this.platformProject = project; + this.config = config; + this.shell = shell; + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + String rootId = SmartBuildInterface.getInstance().getRootstrapIDFromTargetID(targetId); + this.rootstrap = RootstrapManager.getRootstrap(rootId); + this.rootPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(rootstrap.getPath().toOSString()); + + setPlatformPackages(); + setProjectMap(); + } + + public void setPlatformPackages() { + platformPackages.clear(); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + platformPackages = launchUtils.getProjectPackages(platformProject, config.getName()); + + if (platformPackages.isEmpty()) { + String msg = String.format(TizenDebianLaunchMessages.QUESTION_PACKAGING, platformProject.getName()); + if (64 == DialogUtil.openQuestionDialog(msg)) { + if (packagingProject(platformProject)) { + setPlatformPackages(); + } + } + } else { + packages.addAll(platformPackages); + } + } + + private void setAppPackages(IProject appProj) { + appPackages.clear(); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + appPackages = launchUtils.getProjectPackages(appProj, config.getName()); + if (appPackages.isEmpty()) { + String msg = String.format(TizenDebianLaunchMessages.QUESTION_PACKAGING, appProj.getName()); + if (64 == DialogUtil.openQuestionDialog(msg)) { + if (packagingProject(appProj)) { + setAppPackages(appProj); + } + } + } + } + + private void setProjectMap() { + IWorkspace works = ResourcesPlugin.getWorkspace(); + IProject[] projs = works.getRoot().getProjects(); + projectNames.add(APP_PROJ_DEFAULT_SELECTION); + for (IProject p : projs) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(p); + if( info == null) { + continue; + } + IConfiguration cfg = info.getDefaultConfiguration(); + if( cfg == null) { + continue; + } + IManagedProject managedProject = cfg.getManagedProject(); + if( managedProject == null) { + continue; + } + String projectArtifactType = managedProject.getProjectType() != null ? managedProject.getProjectType().getBuildArtefactType().getId() : null; + if (projectArtifactType != null && + projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE) && + !platformProject.getName().equals(p.getName())) { + String name = p.getName(); + projectMap.put(name, p); + projectNames.add(name); + } + } + } + + @Override + public void createControl(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.minimumHeight = 0; + composite.setLayoutData(gridData); + + createProjectsComposite(composite); + createTableTitleComposite(composite); + createTableGroupComposite(composite); + createOptionGroupComposite(composite); + + setControl(composite); + } + + private void createOptionGroupComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + + reinstallOp = new Button(composite, SWT.CHECK); + reinstallOp.setText(resources.getString("Button.Reinstall.Op")); + reinstallOp.setSelection(true); + selectPkgOp = new Button(composite, SWT.CHECK); + selectPkgOp.setText(resources.getString("Button.SelectPkg.Op")); + selectPkgOp.setSelection(false); + } + + private void createTableTitleComposite(Composite parent) { + Label tableLabel = new Label(parent, SWT.NONE); + tableLabel.setText(resources.getString("AppPage.Label.AdditionPkgs")); + } + + private void createProjectsComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + Label projectLabel = new Label(composite, SWT.NONE); + projectLabel.setText(resources.getString("AppPage.Label.Project")); + + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + composite.setLayoutData(gridData); + + projectCombo = new Combo(composite, SWT.READ_ONLY); + projectCombo.setLayoutData(gridData); + projectCombo.setItems(projectNames.toArray(new String[0])); + projectCombo.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) + { + String selected = projectCombo.getText().trim(); + if (APP_PROJ_DEFAULT_SELECTION.equals(selected)) { + packages.clear(); + packages.addAll(platformPackages); + packages.addAll(extraPackages); + } else { + IProject proj = projectMap.get(selected); + setAppPackages(proj); + packages.clear(); + packages.addAll(platformPackages); + packages.addAll(appPackages); + packages.addAll(extraPackages); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + {} + }); + + projectCombo.select(0); + } + + private void createTableComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + GridData gridData = new GridData(GridData.FILL_BOTH); + gridData.minimumWidth = 350; + gridData.minimumHeight = 200; + composite.setLayoutData(gridData); + + Composite t_composite = new Composite(composite, SWT.NONE); + t_composite.setLayout(new FillLayout()); + t_composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + tableViewer = new TableViewer(t_composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + Table table = tableViewer.getTable(); + + table.setHeaderVisible(true); + table.setLinesVisible(true); + + String[] columnNames = new String[] {"RPM files"}; + + int[] columnWidths = new int[] {450}; + for (int i = 0; i < columnNames.length ; i++) { + TableColumn tableColumn = new TableColumn(table, SWT.LEFT); + + tableColumn.setText(columnNames[i]); + tableColumn.setWidth(columnWidths[i]); + tableColumn.setResizable(true); + //tableColumn.addSelectionListener(new TooltableSelectionAdapter()); + } + + tableViewer.setLabelProvider(new TableViewerProvider()); + tableViewer.setContentProvider(new ArrayContentProvider()); + packages.addAll(extraPackages); + tableViewer.setInput(extraPackages); + tableViewer.getTable().addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + }); + + table.addListener(SWT.Dispose, tableListener); + table.addListener(SWT.KeyDown, tableListener); + table.addListener(SWT.MouseMove, tableListener); + table.addListener(SWT.MouseHover, tableListener); + } + + + private void createTableButtonsComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + + Button addBt = new Button(composite, SWT.PUSH); + Image addIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/add.gif"); + addBt.setImage(addIcon); + addBt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + fd = new FileDialog(shell, SWT.OPEN|SWT.MULTI); + fd.setText(resources.getString("AppPage.Dialog.Title.File")); + String[] filterExt = { "*.rpm" }; + fd.setFilterExtensions(filterExt); + selectedFileList = fd.open(); + System.out.println(selectedFileList); + if (selectedFileList != null) { + String[] files = fd.getFileNames(); + String path = fd.getFilterPath(); + for (String f : files) { + LocalPackage p = new LocalPackage(); + p.setPath(new Path(path).append(f).toOSString()); + String name = RPMPackageCommander.getPkgNameForFile(p.getPath()); + p.setName(name); + extraPackages.add(p); + //rpmFiles.add(f); + } + //tableViewer.refresh(); + packages.clear(); + packages.addAll(platformPackages); + packages.addAll(appPackages); + packages.addAll(extraPackages); + tableViewer.refresh(); + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + + }); + + + Button removeBt = new Button(composite, SWT.PUSH); + Image removeIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/remove.gif"); + removeBt.setImage(removeIcon); + } + + + + private void createTableGroupComposite(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + + createTableComposite(composite); + createTableButtonsComposite(composite); + } + + private boolean packagingProject(final IProject targetProj) { + boolean result = false; + + try { + if (getContainer() == null) { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + packagingResult = PlatformProjectPackaging.RPMPackaging(targetProj, config, monitor); + } + }); + } else { + getContainer().run(true, true, + new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, + InterruptedException { + packagingResult = PlatformProjectPackaging.RPMPackaging(targetProj, config, monitor); + } + }); + } + } catch (InvocationTargetException e) { + e.printStackTrace(); + MessageDialog.openError(shell, CommonBuildMessages.BUILD_RESULT, + e.getMessage()); + return false; + } catch (InterruptedException e) { + e.printStackTrace(); + MessageDialog.openError(shell, CommonBuildMessages.BUILD_RESULT, + e.getMessage()); + return false; + } + + if (packagingResult) { + MessageDialog.openInformation(shell, CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.SUCCESS_TO_BUILD_PACKAGE); + result = true; + } else { + MessageDialog.openError(shell, CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.FAIL_TO_BUILD_PACKAGE); + result = false; + } + + return result; + } + + /* selected package table provider */ + private class TableViewerProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + @Override + public String getColumnText(Object element, int columnIndex) { + if ( element instanceof LocalPackage) { + LocalPackage p = (LocalPackage)element; + String name = new Path(p.getPath()).lastSegment(); + + switch(columnIndex) { + case 0: + return name; + default: + break; + } + } + return null; + } + } + + public ArrayList getPackages() { + return packages; + } + + public ArrayList getExtraPackages() { + return extraPackages; + } + + public String getRootstrapPath() { + return rootPath; + } + + public String getAppProjectName() { + return projectCombo.getText().trim(); + } + + public boolean getReinstallOp() { + return reinstallOp.getSelection(); + } + + public boolean getSelectPkgOp() { + return selectPkgOp.getSelection(); + } + + Listener tableListener = new Listener() { + Shell tip = null; + Label label = null; + + public void handleEvent(Event event) { + switch (event.type) { + case SWT.Dispose: + case SWT.KeyDown: + case SWT.MouseMove: { + if (tip == null) { + break; + } + tip.dispose(); + tip = null; + label = null; + break; + } + case SWT.MouseHover: { + TableItem item = tableViewer.getTable().getItem(new Point(event.x, event.y)); + if (item != null) { + if (tip != null && !tip.isDisposed()) { + tip.dispose(); + } + tip = new Shell(getShell(), SWT.ON_TOP | SWT.TOOL); + tip.setLayout(new FillLayout()); + label = new Label(tip, SWT.NONE); + LocalPackage pkg = (LocalPackage)item.getData(); + + label.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + label.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + + label.setData("_TABLEITEM", item); + label.setText(pkg.getPath()); + label.addListener(SWT.MouseExit, labelListener); + label.addListener(SWT.MouseDown, labelListener); + Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT); + Rectangle rect = item.getBounds(0); + Point pt = tableViewer.getTable().toDisplay(rect.x, rect.y); + tip.setBounds(pt.x + 50, pt.y + 10, size.x, size.y); + tip.setVisible(true); + } + } + default: + break; + } + } + }; + + // Implement a "fake" tooltip + final Listener labelListener = new Listener() { + public void handleEvent(Event event) { + Label label = (Label) event.widget; + Shell shell = label.getShell(); + switch (event.type) { + case SWT.MouseDown: + Event e = new Event(); + e.item = (TableItem) label.getData("_TABLEITEM"); + // Assuming table is single select, set the selection as if + // the mouse down event went through to the table + tableViewer.getTable().setSelection(new TableItem[] { (TableItem) e.item }); + tableViewer.getTable().notifyListeners(SWT.Selection, e); + // fall through + case SWT.MouseExit: + shell.dispose(); + break; + default: + break; + } + } + }; + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingBinPage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingBinPage.java new file mode 100644 index 0000000..383cc14 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingBinPage.java @@ -0,0 +1,141 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizard.pages; + +import java.util.ResourceBundle; + +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.common.connection.ui.TizenRemoteFileDialog; +import org.tizen.common.connection.ui.TizenRemoteFileDialog.TizenRemoteFileDialogResult; +import org.tizen.nativecommon.launch.TizenLaunchMessages; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchWizard; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchWizardDialog; +import org.tizen.nativeplatform.views.ui.AddRootstrapDialog; +import org.tizen.sdblib.IDevice; +import org.tizen.sdblib.FileListingService.FileEntry; + +public class PlatformLaunchSettingBinPage extends WizardPage { + + private final String BUNDLE_NAME = PlatformLaunchSettingBinPage.class.getPackage().getName() + ".LaunchWizardPageUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + private PlatformLaunchWizard wizard; + + private Text text; + private String filePath = ""; + private static final String DEFAULT_APP_PATH = "/opt/apps/"; + + public PlatformLaunchSettingBinPage(PlatformLaunchWizard wizard, String pageName) { + super(pageName); + this.wizard = wizard; + setTitle(resources.getString("BinPage.Title")); + setDescription(resources.getString("BinPage.Desc")); + setPageComplete(true); + } + + @Override + public void createControl(Composite parent) { + // TODO Auto-generated method stub + Composite composite = new Composite(parent, SWT.NULL); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + text = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); + GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + text.setLayoutData(data); + + Button browseButton = new Button(composite, SWT.PUSH); + browseButton.setText(resources.getString("BinPage.Button.Browse")); + browseButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + String path = handleBrowseButtonSelected(); + if (path != null) { + text.setText(path); + wizard.setEnableFinish(true); + wizard.getContainer().updateButtons(); + } else { + wizard.setEnableFinish(false); + wizard.getContainer().updateButtons(); + } + } + }); + + setControl(composite); + } + + protected String handleBrowseButtonSelected() { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window == null) { + IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); + window = windows[0]; + } + + final Shell shell = window.getShell(); + if (shell != null) { + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + if (device == null) { + MessageBox msgBox = new MessageBox(shell, SWT.ICON_INFORMATION); + msgBox.setMessage(TizenLaunchMessages.CANNOT_CONNECT_TO_DEVICE); + msgBox.open(); + return null; + } + + shell.getDisplay().syncExec( new Runnable() { + public void run() { + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + TizenRemoteFileDialog dlg = new TizenRemoteFileDialog(shell, + resources.getString("BinPage.Remote.Dialog.Title"), device, false, DEFAULT_APP_PATH); + if(dlg.open() == TizenRemoteFileDialogResult.OK) { + FileEntry selectedFile = dlg.getSelectedFileEntry(); + filePath = selectedFile.getFullPath().trim(); + } else + filePath = null; + } + }); + } + return filePath; + } + + + public String getPath() { + return text.getText().trim(); + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingProcPage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingProcPage.java new file mode 100644 index 0000000..366db5c --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizard/pages/PlatformLaunchSettingProcPage.java @@ -0,0 +1,300 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizard.pages; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.cdt.core.IProcessInfo; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativecommon.build.CommonBuildMessages; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.build.PlatformProjectPackaging; +import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchUtils; +import org.tizen.nativeplatform.launch.wizards.PlatformLaunchWizard; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; + +import org.tizen.sdblib.IDevice; + +public class PlatformLaunchSettingProcPage extends WizardPage { + + private final String BUNDLE_NAME = PlatformLaunchSettingProcPage.class.getPackage().getName() + ".LaunchWizardPageUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private Button reinstallOp; + private Button selectPkgOp; + private Text processText; + private Text pathText; + private int pid; + private IProcessInfo procInfo; + private Shell shell; + private String rootPath = ""; + private String procName = ""; + private PlatformLaunchWizard wizard; + + + private IConfiguration config; + private IProject platformProject; + private PlatformRootstrap rootstrap; + private IDevice device; + private boolean packagingResult; + private ArrayList platformPackages = new ArrayList(); + private ArrayList packages = new ArrayList(); + + public PlatformLaunchSettingProcPage(PlatformLaunchWizard wizard, Shell shell, String pageName, IProject project, IConfiguration config) { + super(pageName); + + setTitle(resources.getString("ProcPage.Title")); + setDescription(resources.getString("ProcPage.Desc")); + setPageComplete(true); + + this.wizard = wizard; + this.platformProject = project; + this.config = config; + this.shell = shell; + this.device = ConnectionPlugin.getDefault().getCurrentDevice(); + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + String rootId = SmartBuildInterface.getInstance().getRootstrapIDFromTargetID(targetId); + this.rootstrap = RootstrapManager.getRootstrap(rootId); + this.rootPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(rootstrap.getPath().toOSString()); + + setPlatformPackages(); + } + + public void setPlatformPackages() { + platformPackages.clear(); + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + platformPackages = launchUtils.getProjectPackages(platformProject, config.getName()); + + if (platformPackages.isEmpty()) { + String msg = String.format(TizenDebianLaunchMessages.QUESTION_PACKAGING, platformProject.getName()); + if (64 == DialogUtil.openQuestionDialog(msg)) { + if (packagingProject(platformProject)) { + setPlatformPackages(); + } + } + } else { + packages.addAll(platformPackages); + } + } + + @Override + public void createControl(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.minimumHeight = 0; + composite.setLayoutData(gridData); + + createProcessComposite(composite); + createProcessInfoComposite(composite); + createOptionGroupComposite(composite); + + setControl(composite); + } + + private void createOptionGroupComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_END)); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + + reinstallOp = new Button(composite, SWT.CHECK); + reinstallOp.setText(resources.getString("Button.Reinstall.Op")); + reinstallOp.setSelection(true); + selectPkgOp = new Button(composite, SWT.CHECK); + selectPkgOp.setText(resources.getString("Button.SelectPkg.Op")); + selectPkgOp.setSelection(false); + } + + private void createProcessComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 3; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + composite.setLayoutData(gridData); + + Label procLabel = new Label(composite, SWT.NONE); + procLabel.setText(resources.getString("ProcPage.Label.ProcName")); + + processText = new Text(composite, SWT.BORDER | SWT.READ_ONLY); + processText.setLayoutData(gridData); + Button findBt = new Button(composite, SWT.PUSH); + findBt.setText(resources.getString("ProcPage.Button.Browse")); + findBt.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent evt) { + PlatformLaunchUtils launchUtils = new PlatformLaunchUtils(); + procInfo = launchUtils.getProcess(shell, device); + if (procInfo != null) { + IPath ppath = new Path(procInfo.getName()); + pid = procInfo.getPid(); + String name = ppath.lastSegment().trim(); + String value = name + " [" + String.valueOf(pid) + "]"; + processText.setText(value); + procName = name; + pathText.setText(procInfo.getName()); + wizard.setEnableFinish(true); + wizard.getContainer().updateButtons(); + } else { + wizard.setEnableFinish(false); + wizard.getContainer().updateButtons(); + } + } + }); + } + + private void createProcessInfoComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 2; + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + composite.setLayout(gridLayout); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + composite.setLayoutData(gridData); + + Label procPath = new Label(composite, SWT.NONE); + procPath.setText(resources.getString("ProcPage.Label.ProcPath")); + + pathText = new Text(composite, SWT.BORDER | SWT.READ_ONLY); + pathText.setLayoutData(gridData); + } + + public String getProgramPath() { + return pathText.getText().trim(); + } + + public int getPid() { + return pid; + } + + public String getRootstrapPath() { + return rootPath; + } + + public String getProcName() { + return procName; + } + + public ArrayList getPackages() { + return packages; + } + + public boolean getReinstallOp() { + return reinstallOp.getSelection(); + } + + public boolean getSelectPkgOp() { + return selectPkgOp.getSelection(); + } + + + private boolean packagingProject(final IProject targetProj) { + boolean result = false; + + try { + if (getContainer() == null) { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + packagingResult = PlatformProjectPackaging.RPMPackaging(targetProj, config, monitor); + } + }); + } else { + getContainer().run(true, true, + new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, + InterruptedException { + packagingResult = PlatformProjectPackaging.RPMPackaging(targetProj, config, monitor); + } + }); + } + } catch (InvocationTargetException e) { + e.printStackTrace(); + MessageDialog.openError(shell, CommonBuildMessages.BUILD_RESULT, + e.getMessage()); + return false; + } catch (InterruptedException e) { + e.printStackTrace(); + MessageDialog.openError(shell, CommonBuildMessages.BUILD_RESULT, + e.getMessage()); + return false; + } + + if (packagingResult) { + MessageDialog.openInformation(shell, CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.SUCCESS_TO_BUILD_PACKAGE); + result = true; + } else { + MessageDialog.openError(shell, CommonBuildMessages.BUILD_RESULT, + CommonBuildMessages.FAIL_TO_BUILD_PACKAGE); + result = false; + } + + return result; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/LaunchWizardUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/LaunchWizardUIMessages.properties new file mode 100644 index 0000000..2b4cdcb --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/LaunchWizardUIMessages.properties @@ -0,0 +1,4 @@ +PkgDialog.Title = Select packages to be installed +PkgDialog.Desc = Checked packages will be installed to buildsystem and device +PkgDialog.Label.Buildsystem = To Buildsystem: +PkgDialog.Label.Device = To Device: diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformAttachLaunchWizard.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformAttachLaunchWizard.java new file mode 100644 index 0000000..209779d --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformAttachLaunchWizard.java @@ -0,0 +1,140 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizards; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.wizard.IWizardContainer; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.widgets.Shell; +import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; +import org.tizen.nativeplatform.launch.wizard.pages.PlatformLaunchSettingProcPage; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.views.ui.AddRootstrapDialog; + + +public class PlatformAttachLaunchWizard extends PlatformLaunchWizard { + + private int pid; + private String procName; + + private final String SETTING_PROC_PAGE = "setting_proc"; + + public PlatformAttachLaunchWizard(Shell shell, IProject project, IConfiguration config, String mode) { + super(shell, project, config, mode); + } + + @Override + public void addPages() { + addPage(new PlatformLaunchSettingProcPage(this, shell, SETTING_PROC_PAGE, project, config)); + + WizardDialog dialog = (WizardDialog)getContainer(); + dialog.addPageChangedListener(this); + dialog.addPageChangingListener(this); + } + + public String getProgramPath() { + return programPath; + } + + public int getPid() { + return pid; + } + + public String getProcName() { + return procName; + } + + @Override + public boolean performFinish() { + PlatformLaunchSettingProcPage page = (PlatformLaunchSettingProcPage)getPage(SETTING_PROC_PAGE); + programPath = page.getProgramPath(); + pid = page.getPid(); + + final String rootstrapPath = page.getRootstrapPath(); + packages = page.getPackages(); + IWizardContainer container = getContainer(); + final PlatformLaunchUtils launchUtil = new PlatformLaunchUtils(); + reinstallOp = page.getReinstallOp(); + selectPkgOp = page.getSelectPkgOp(); + procName = page.getProcName(); + pid = page.getPid(); + + //container.run(fork, cancelable, runnable) + + try { + container.run(true, true, + new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, + InterruptedException { + monitor.beginTask(TizenDebianLaunchMessages.INSTALL_PACKAGE, 2); + monitor.subTask(TizenDebianLaunchMessages.CHECK_PKG_STATUS); + + final ArrayList BuildSystemPkgs = new ArrayList(); + final ArrayList DevicePkgs = new ArrayList(); + + launchUtil.filterBuildsystemPkgs(packages, BuildSystemPkgs, rootstrapPath, reinstallOp); + + if (selectPkgOp) { + if (!openPkgStatusDialog(BuildSystemPkgs, DevicePkgs)) { + return; + } + } + + ArrayList selecteBsPkgs = launchUtil.getSelectedPackages(BuildSystemPkgs); + + monitor.worked(1); + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_BUILDSYSTEM); + + if (selecteBsPkgs != null && !selecteBsPkgs.isEmpty()) { + launchUtil.installPkgsToRootstrap(selecteBsPkgs, rootstrapPath, new SubProgressMonitor(monitor, 1)); + } + + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + openLogDialog(TizenDebianLaunchMessages.FAILED_INSTALL_PKGS, e.getMessage()); + } + + return true; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchUtils.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchUtils.java new file mode 100644 index 0000000..24de4c4 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchUtils.java @@ -0,0 +1,594 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizards; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; + +import org.eclipse.cdt.core.IProcessInfo; +import org.eclipse.cdt.core.IProcessList; +import org.eclipse.cdt.launch.internal.ui.LaunchImages; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.window.Window; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.console.MessageConsoleStream; +import org.eclipse.ui.dialogs.TwoPaneElementSelector; +import org.tizen.common.TizenPlatformConstants; +import org.tizen.common.ui.view.console.ConsoleManager; +import org.tizen.common.util.FileUtil; +import org.tizen.nativecommon.launch.LaunchUtils; +import org.tizen.nativecommon.launch.TizenDeviceProcessList; +import org.tizen.nativecommon.launch.TizenLaunchCommand; +import org.tizen.nativecommon.launch.TizenLaunchMessages; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.pkgmgr.PackageManagerOuputReceiver; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.sdblib.IDevice; +import org.tizen.sdblib.SdbCommandRejectedException; +import org.tizen.sdblib.SyncService; +import org.tizen.sdblib.SyncService.SyncResult; +import org.tizen.sdblib.TimeoutException; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +@SuppressWarnings("restriction") +public class PlatformLaunchUtils { + + private IProcessInfo procInfo; + + public PlatformLaunchUtils() { + + } + + public boolean installPkgsToRootstrap(ArrayList packages, String rootPath, + IProgressMonitor monitor) throws InterruptedException { + + monitor.beginTask("Installing packages to rootstrap", 3); + + String rpmPathList = ""; + String localPkgList = ""; + + for (LocalPackage p : packages) { + String filePath = p.getPath(); + String filename = new File(filePath).getName(); + String pathOnRootstrap = "/tmp/" + filename; + String copyToPath = rootPath + pathOnRootstrap; + try { + FileUtil.copyTo(filePath, copyToPath); + } catch (IOException e) { + e.printStackTrace(); + } + rpmPathList = rpmPathList.concat(pathOnRootstrap + " "); + localPkgList = localPkgList.concat(p.getName() + " "); + } + + boolean error = false; + String log = ""; + + //monitor.subTask("Installing packages.."); + + + String proxy = PreferencesManager.getProxyURL(); + RPMPackageCommander.setHttpProxy(proxy); + Document doc = RPMPackageCommander.InstallPkgWithZypperXmlOut(rootPath, rpmPathList, true, true); + + doc.getDocumentElement().normalize(); + NodeList messageNodes = doc.getElementsByTagName("message"); + + + for (int i = 0; i < messageNodes.getLength() ; i++) { + Node ii = messageNodes.item(i); + NamedNodeMap map = ii.getAttributes(); + Node node = map.getNamedItem("type"); + if (node != null) { + String type = node.getNodeValue(); + if (type.equals("error")) { + error = true; + log = log + "[ERROR] " + ii.getFirstChild().getNodeValue() + "\n"; + } else { + log = log + "[INFO] " + ii.getFirstChild().getNodeValue() + "\n"; + } + } + } + + if (error) { + newException(log); + } + monitor.worked(1); + + monitor.subTask("Checking installed successfully.."); + String failedInstallPkgs = ""; + for (LocalPackage p : packages) { + String name = p.getName(); + if(!RPMPackageCommander.pkgInstalledSuccessfullyForRootstrap(name, rootPath)) { + failedInstallPkgs = failedInstallPkgs + " - " + name + newline(); + } + } + + if (failedInstallPkgs != "") { + newException(log); + } + monitor.worked(2); + monitor.done(); + + return true; + } + + public boolean installPkgsToDevice(ArrayList packages, IDevice device, IProgressMonitor monitor) + throws InterruptedException { + + monitor.beginTask("Installing packages to rootstrap", 3); + + ArrayList packagesForDevice = new ArrayList(); + ConsoleManager cm = new ConsoleManager("package manager", true); + //cm.clear(); + MessageConsoleStream mcs = cm.getMessageConsoleStream(); + PackageManagerOuputReceiver rec = new PackageManagerOuputReceiver(); + rec.setMessageConsoleStream(mcs); + + ArrayList localPkgList = new ArrayList(); + + for (LocalPackage p : packages) { + String file = new File(p.getPath()).getName(); + + if (file.contains("-debugsource") || file.contains("-debuginfo") || + file.contains("-devel")) { + continue; + } + + packagesForDevice.add(p); + localPkgList.add(p.getPath()); + } + + //monitor.subTask("Installing packages.."); + RPMPackageCommander.InstallLocalPkgToDevice(localPkgList, device); + monitor.worked(1); + + // check to install successfully + monitor.subTask("Checking installed successfully.."); + String failedInstallPkgs = ""; + for (LocalPackage p : packagesForDevice) { + String name = p.getName(); + if(!RPMPackageCommander.pkgInstalledSuccessfullyForDevice(name, device, rec)) { + failedInstallPkgs = failedInstallPkgs + " - " + name + newline(); + } + } + + if (failedInstallPkgs != "") { + String msg = String.format("Follow package does not installed successfully.\n\n" + + "%s\n" + + "You can install package through package manager manually.", failedInstallPkgs); + newException(msg); + return false; + } + monitor.worked(2); + monitor.done(); + + return true; + } + + private String newline() { + return "\n"; + } + + protected void newException(String message) throws InterruptedException { + //Status status = new Status(Status.ERROR, Activator.PLUGIN_ID, message, exception); + //throw new CoreException(status); + throw new InterruptedException(message); + } + + public IProject getProjectInstance(String projectName) { + IWorkspace works = ResourcesPlugin.getWorkspace(); + IProject[] projs = works.getRoot().getProjects(); + IProject result = null; + for (IProject p : projs) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(p); + if( info == null) { + continue; + } + IConfiguration cfg = info.getDefaultConfiguration(); + if( cfg == null) { + continue; + } + IManagedProject managedProject = cfg.getManagedProject(); + if( managedProject == null) { + continue; + } + String projectArtifactType = managedProject.getProjectType() != null ? managedProject.getProjectType().getBuildArtefactType().getId() : null; + if (projectArtifactType != null && + projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE) && + projectName.equals(p.getName())) { + result = p; + break; + } + } + + return result; + } + + public ArrayList getProjectPackages(IProject project, String configName) { + ArrayList pkgs = new ArrayList(); + IFolder folder = project.getFolder(configName); + File dir = new File(folder.getLocation().toOSString()); + if (dir.exists()) { + for (File f : dir.listFiles()) { + if (f.isFile() && f.getName().endsWith(".rpm")) { + IPath pkgPath = new Path(dir.getPath()).append(f.getName()); + LocalPackage pkg = getLocalPackage(pkgPath.toOSString()); + pkgs.add(pkg); + } + } + } + + return pkgs; + } + + public LocalPackage getLocalPackage(String pkgfilePath) { + LocalPackage pkg = new LocalPackage(); + pkg.setPath(pkgfilePath); + String name = RPMPackageCommander.getPkgNameForFile(pkg.getPath()); + pkg.setName(name); + return pkg; + } + + public ArrayList getLocalPackages(ArrayList pkgPaths) { + ArrayList pkgs = new ArrayList(); + for (String path : pkgPaths) { + LocalPackage pkg = getLocalPackage(path); + pkgs.add(pkg); + } + + return pkgs; + } + + public void filterBuildsystemPkgs(ArrayList totalPackages, + ArrayList buildsystePkgs, String rootstrapPath, boolean reinstallOp) { + for (LocalPackage pkg : totalPackages) { + buildsystePkgs.add(pkg.clone()); + } + + updateBuildsystemPkgs(buildsystePkgs, rootstrapPath, reinstallOp); + } + + public void filterDevicePackages(ArrayList totalPackages, + ArrayList devicePkgs, IDevice device, boolean reinstallOp) { + + for (LocalPackage pkg : totalPackages) { + String name = pkg.getName(); + if (name.contains("-debugsource") || name.contains("-debuginfo") || + name.contains("-devel")) { + continue; + } else { + devicePkgs.add(pkg.clone()); + } + } + + updateDevicePkgs(devicePkgs, device, reinstallOp); + } + + private void updateBuildsystemPkgs(ArrayList pkgs, String rootstrapPath, + boolean reinstallOp) { + for (LocalPackage pkg : pkgs) { + String newVer = RPMPackageCommander.getPkgVerForFile(pkg.getPath()); + String arch = RPMPackageCommander.getArchForFile(pkg.getPath()); + String installedVerForRootstrap = RPMPackageCommander.getPkgInstalledVerForRootstrap(pkg.getName(), rootstrapPath); + + pkg.setNewVersion(newVer); + pkg.setArch(arch); + pkg.setInstalledVersion(installedVerForRootstrap); + + pkg.setCheckColumn(true); + + if ("".equals(newVer)) { + pkg.setCheckColumn(false); + } else if (!"".equals(installedVerForRootstrap)) { + if (!installedVerForRootstrap.equals(newVer)) { + pkg.setInstallInfo(Package.INSTALLINFO.DIFFERENT_VERSION); + } else { + if (RPMPackageCommander.pkgInstalledSuccessfullyForRootstrap(pkg.getName(), rootstrapPath)) { + pkg.setInstallInfo(Package.INSTALLINFO.INSTALLED); + if (!reinstallOp) { + pkg.setCheckColumn(false); + } + } + } + } + } + } + + private void updateDevicePkgs(ArrayList pkgs, IDevice device, + boolean reinstallOp) { + PackageManagerOuputReceiver rec = getNewOuputReceiver(); + + for (LocalPackage pkg : pkgs) { + String newVer = RPMPackageCommander.getPkgVerForFile(pkg.getPath()); + String arch = RPMPackageCommander.getArchForFile(pkg.getPath()); + String installedVer = RPMPackageCommander.getPkgInstalledVerForDevice(pkg.getName(), device, rec); + + pkg.setNewVersion(newVer); + pkg.setArch(arch); + pkg.setInstalledVersion(installedVer); + + pkg.setCheckColumn(true); + + if ("".equals(newVer)) { + pkg.setCheckColumn(false); + } else if (!"".equals(installedVer)) { + if (!installedVer.equals(newVer)) { + pkg.setInstallInfo(Package.INSTALLINFO.DIFFERENT_VERSION); + } else { + if (RPMPackageCommander.pkgInstalledSuccessfullyForDevice(pkg.getName(), device, rec)) { + pkg.setInstallInfo(Package.INSTALLINFO.INSTALLED); + if (!reinstallOp) { + pkg.setCheckColumn(false); + } + } + } + } + } + } + + public ArrayList getSelectedPackages(ArrayList pkgs) { + ArrayList selectedPkgs = new ArrayList(); + for (LocalPackage pkg : pkgs) { + if (pkg.getCheckColumn()) { + selectedPkgs.add(pkg); + } + } + + return selectedPkgs; + } + + + private PackageManagerOuputReceiver getNewOuputReceiver() { + ConsoleManager cm = new ConsoleManager("debug launch", true); + cm.clear(); + MessageConsoleStream mcs = cm.getMessageConsoleStream(); + PackageManagerOuputReceiver rec = new PackageManagerOuputReceiver(); + rec.setMessageConsoleStream(mcs); + + return rec; + } + + public IProcessInfo getProcess(final Shell shell, final IDevice device) { + Display.getDefault().syncExec(new Runnable() { + public void run() { + procInfo = selectProcess(shell, device, null); + } + }); + + return procInfo; + } + + public IProcessInfo getProcess(final Shell shell, final IDevice device, final String procName) { + Display.getDefault().syncExec(new Runnable() { + public void run() { + procInfo = selectProcess(shell, device, procName); + } + }); + + return procInfo; + } + + private IProcessInfo selectProcess(Shell shell, IDevice device, String procName) { + if (shell == null) { + return null; + } + + IProcessList processList = null; + processList = new TizenDeviceProcessList(device); + + IProcessInfo pInfos[] = null; + IProcessInfo resultInfo = null; + pInfos = processList.getProcessList(); + + if(pInfos == null) { + return null; + } + + int count = 0; + if (procName != null) { + for (IProcessInfo info : pInfos) { + String name = new Path(info.getName()).lastSegment().trim(); + if (procName.equals(name)) { + resultInfo = info; + count++; + } + } + } + + if (count == 1) { + return resultInfo; + } + + ILabelProvider topprovider = new LabelProvider() { + public String getText(Object element) { + IProcessInfo pinfo = (IProcessInfo)element; + IPath ppath = new Path(pinfo.getName()); + return ppath.lastSegment().trim() + " [" + String.valueOf(pinfo.getPid()) + "]"; //$NON-NLS-1$ + } + + public Image getImage(Object element) { + return LaunchImages.get(LaunchImages.IMG_OBJS_EXEC); + } + }; + + ILabelProvider downprovider = new LabelProvider() { + public String getText(Object element) { + IProcessInfo info = (IProcessInfo)element; + return info.getName(); + } + + public Image getImage(Object element) { + return LaunchImages.get(LaunchImages.IMG_OBJS_EXEC); + } + }; + + TwoPaneElementSelector dlg = new TwoPaneElementSelector(shell, topprovider, downprovider); + dlg.setTitle(String.format("Select Process [%s]", device.getDeviceName())); //$NON-NLS-1$ + String dlgMsg = ""; + if (procName != null && count == 0) { + dlgMsg = String.format("There is no \"%s\" process.\n", procName); + } else if (procName != null && count > 1) { + dlgMsg = String.format("There are some \"%s\" processes.\n", procName); + } + dlgMsg = dlgMsg + "Select a Process to attach debugger to:"; + dlg.setMessage(dlgMsg); //$NON-NLS-1$ + dlg.setElements(pInfos); + + if (dlg.open() == Window.OK) { + resultInfo = (IProcessInfo)dlg.getFirstResult(); + return resultInfo; + } + + return null; + } + + public String[] getProjectInfo(IProject project) { + String[] infos = new String[2]; + String name = null; + String version = null; + IFolder folder = project.getFolder("packaging"); + File dir = new File(folder.getLocation().toOSString()); + File specfile = null; + if (dir.exists()) { + for (File f : dir.listFiles()) { + if (f.isFile() && f.getName().endsWith(".spec")) { + specfile = f; + break; + } + } + } + + try { + BufferedReader in = new BufferedReader(new FileReader(specfile.getPath())); + String s; + + while ((s = in.readLine()) != null ) { + s = s.trim(); + if (s.trim().startsWith("Name:")) { + String[] arrStr = s.split(":"); + if (arrStr.length == 2) { + name = arrStr[1].trim(); + continue; + } + } else if (s.trim().startsWith("Version:")) { + String[] arrStr = s.split(":"); + if (arrStr.length == 2) { + version = arrStr[1].trim(); + continue; + } + } + + if (name != null && version != null) { + break; + } + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (name != null && version != null) { + infos[0] = name; + infos[1] = version; + return infos; + } else { + return null; + } + } + + public boolean checkGdbServerInDevice(IDevice device, TizenLaunchCommand command) throws CoreException { + String resultCommand = TizenPlatformConstants.GDBSERVER_PLATFORM_CMD + " --version" + + TizenPlatformConstants.CMD_RESULT_CHECK; + try { + command.run(resultCommand, "0"); + } catch (Exception e) { + //LaunchUtils.newCoreException(NLS.bind(TizenLaunchMessages.CANNOT_FIND_GDBSERVER, device.getDeviceName()), e); + return false; + } + + return true; + } + + public void readyGdbServer(IDevice device, TizenLaunchCommand command, IPath srcPath) + throws CoreException, TimeoutException, SdbCommandRejectedException, IOException { + File gdbserver = new File(srcPath.toOSString()); + + if (!gdbserver.exists()) { + LaunchUtils.newCoreException(NLS.bind(TizenLaunchMessages.CANNOT_FIND_GDBSERVER, device.getDeviceName()), null); + } + + if (!checkGdbServerInDevice(device, command)) { + copyFileToDevice(device, srcPath.toOSString(), TizenPlatformConstants.GDBSERVER_PLATFORM_CMD); + device.executeShellCommand(String.format("chmod +x %s", TizenPlatformConstants.GDBSERVER_PLATFORM_CMD)); + } + } + + public void copyFileToDevice(IDevice device, String srcPath, String descPath) throws CoreException, TimeoutException, SdbCommandRejectedException, IOException { + SyncResult syncSuccess = device.getSyncService().pushFile(srcPath, + descPath, SyncService.getNullProgressMonitor()); + + if (syncSuccess.getCode() != SyncService.RESULT_OK) { + LaunchUtils.newCoreException(TizenLaunchMessages.CANNOT_TRANSFER_FILE, null); + } + } + + public boolean checkGdbServerInBuildSystem(String rootstrapPath) { + IPath path = new Path(rootstrapPath).append("usr").append("bin").append("gdbserver"); + File gdbserver = new File(path.toOSString()); + + return gdbserver.exists(); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizard.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizard.java new file mode 100644 index 0000000..ad7c0c3 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizard.java @@ -0,0 +1,255 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizards; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.jface.dialogs.IPageChangedListener; +import org.eclipse.jface.dialogs.IPageChangingListener; +import org.eclipse.jface.dialogs.PageChangedEvent; +import org.eclipse.jface.dialogs.PageChangingEvent; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.window.Window; +import org.eclipse.jface.wizard.IWizardContainer; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.widgets.Shell; +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.common.util.SWTUtil; +import org.tizen.nativeplatform.launch.TizenDebianLaunchMessages; +import org.tizen.nativeplatform.launch.wizard.pages.PlatformLaunchSettingAppPage; +import org.tizen.nativeplatform.launch.wizard.pages.PlatformLaunchSettingBinPage; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.sdblib.IDevice; + +public class PlatformLaunchWizard extends Wizard implements IPageChangingListener, IPageChangedListener { + + protected IProject project; + protected IConfiguration config; + protected IDevice device; + protected Shell shell; + protected String programPath = ""; + protected String appProjectName = ""; + protected boolean reinstallOp; + protected boolean selectPkgOp; + protected ArrayList packages = new ArrayList(); + protected ArrayList extraPackages = new ArrayList(); + protected String appProject = ""; + protected String mode = ""; + protected boolean result; + protected boolean canFinish = false; + + private final String SETTING_APP_PAGE = "setting_app"; + private final String SETTING_BIN_PAGE = "setting_bin"; + + public PlatformLaunchWizard() { + } + + public PlatformLaunchWizard(Shell shell, IProject project, IConfiguration config, String mode) { + this.project = project; + this.config = config; + this.shell = shell; + this.device = ConnectionPlugin.getDefault().getCurrentDevice(); + this.mode = mode; + setWindowTitle("Launch Configuration"); + setNeedsProgressMonitor(true); + } + + @Override + public boolean needsProgressMonitor() { + return true; + } + + @Override + public boolean canFinish() { + return canFinish; + } + + public void setEnableFinish(boolean value) { + canFinish = value; + } + + @Override + public boolean performFinish() { + PlatformLaunchSettingBinPage binPage = (PlatformLaunchSettingBinPage)getPage(SETTING_BIN_PAGE); + programPath = binPage.getPath(); + + PlatformLaunchSettingAppPage appPage = (PlatformLaunchSettingAppPage)getPage(SETTING_APP_PAGE); + appProjectName = appPage.getAppProjectName(); + extraPackages = appPage.getExtraPackages(); + + return true; + } + + public String getProgramPath() { + return programPath; + } + + public ArrayList getPackages() { + return packages; + } + + public ArrayList getExtraPackages() { + return extraPackages; + } + + public String getAppProjectName() { + return appProjectName; + } + + public boolean getReinstallOp() { + return reinstallOp; + } + + public boolean getSelectPkgOp() { + return selectPkgOp; + } + + @Override + public void addPages() { + addPage(new PlatformLaunchSettingAppPage(shell, SETTING_APP_PAGE, project, config)); + addPage(new PlatformLaunchSettingBinPage(this, SETTING_BIN_PAGE)); + + WizardDialog dialog = (WizardDialog)getContainer(); + dialog.addPageChangedListener(this); + dialog.addPageChangingListener(this); + } + + @Override + public void pageChanged(PageChangedEvent event) { + + WizardPage selectedPage = (WizardPage)event.getSelectedPage(); + } + + @Override + public void handlePageChanging(final PageChangingEvent event) { + // TODO Auto-generated method stub + WizardPage currentPage = (WizardPage)event.getCurrentPage(); + WizardPage targetPage = (WizardPage)event.getTargetPage(); + + if (currentPage.getName().equals(SETTING_APP_PAGE) && targetPage.getName().equals(SETTING_BIN_PAGE)) { + PlatformLaunchSettingAppPage page = (PlatformLaunchSettingAppPage)currentPage; + final String rootstrapPath = page.getRootstrapPath(); + packages = page.getPackages(); + IWizardContainer container = getContainer(); + final PlatformLaunchUtils launchUtil = new PlatformLaunchUtils(); + final IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + reinstallOp = page.getReinstallOp(); + selectPkgOp = page.getSelectPkgOp(); + + //container.run(fork, cancelable, runnable) + + try { + container.run(true, true, + new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) + throws InvocationTargetException, + InterruptedException { + monitor.beginTask(TizenDebianLaunchMessages.INSTALL_PACKAGE, 3); + monitor.subTask(TizenDebianLaunchMessages.CHECK_PKG_STATUS); + + final ArrayList BuildSystemPkgs = new ArrayList(); + final ArrayList DevicePkgs = new ArrayList(); + + if (mode.equals(ILaunchManager.DEBUG_MODE)) { + launchUtil.filterBuildsystemPkgs(packages, BuildSystemPkgs, rootstrapPath, reinstallOp); + } + launchUtil.filterDevicePackages(packages, DevicePkgs, device, reinstallOp); + + if (selectPkgOp) { + if (!openPkgStatusDialog(BuildSystemPkgs, DevicePkgs)) { + cancelChanging(event); + return; + } + } + + ArrayList selecteBsPkgs = launchUtil.getSelectedPackages(BuildSystemPkgs); + ArrayList selecteDvPkgs = launchUtil.getSelectedPackages(DevicePkgs); + + monitor.worked(1); + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_BUILDSYSTEM); + + if (selecteBsPkgs != null && !selecteBsPkgs.isEmpty()) { + launchUtil.installPkgsToRootstrap(selecteBsPkgs, rootstrapPath, new SubProgressMonitor(monitor, 1)); + } + + monitor.subTask(TizenDebianLaunchMessages.INSTALL_PACKAGES_TO_DEVICE); + if (selecteDvPkgs != null && !selecteDvPkgs.isEmpty()) { + launchUtil.installPkgsToDevice(selecteDvPkgs, device, new SubProgressMonitor(monitor, 1)); + } + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + openLogDialog(TizenDebianLaunchMessages.FAILED_INSTALL_PKGS, e.getMessage()); + cancelChanging(event); + } + } + } + + public void cancelChanging(PageChangingEvent event) { + event.doit = false; + } + + public void openLogDialog(final String desc, final String log) { + SWTUtil.syncExec(new Runnable() { + public void run() { + ShowLogDialog dialog = new ShowLogDialog(shell, desc, log); + dialog.open(); + } + }); + } + + public boolean openPkgStatusDialog(final ArrayList BuildSystemPkgs, final ArrayList DevicePkgs) { + SWTUtil.syncExec(new Runnable() { + public void run() { + ShowPackageStatusDialog statusDlg = new ShowPackageStatusDialog(shell, BuildSystemPkgs, DevicePkgs); + if (Window.OK == statusDlg.open()) { + result = true; + } else { + result = false; + } + } + }); + + return result; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizardDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizardDialog.java new file mode 100644 index 0000000..6a367f3 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/PlatformLaunchWizardDialog.java @@ -0,0 +1,116 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizards; + +import java.util.ArrayList; + +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.widgets.Shell; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; + +public class PlatformLaunchWizardDialog extends WizardDialog { + + private PlatformLaunchWizard wizard = null; + private PlatformAttachLaunchWizard attachWizard = null; + + public PlatformLaunchWizardDialog(Shell shell, PlatformLaunchWizard wizard) { + super(shell, wizard); + + this.wizard = wizard; + } + + public PlatformLaunchWizardDialog(Shell shell, PlatformAttachLaunchWizard wizard) { + super(shell, wizard); + + this.attachWizard = wizard; + } + + + + public String getProgramPath() { + if (wizard != null) { + return wizard.getProgramPath(); + } else if (attachWizard != null) { + return attachWizard.getProgramPath(); + } else { + return null; + } + } + + public ArrayList getExtraPackages() { + if (wizard != null) { + return wizard.getExtraPackages(); + } else { + return null; + } + } + + public String getAppProjectName() { + if (wizard != null) { + return wizard.getAppProjectName(); + } else { + return null; + } + } + + public boolean getReinstallOp() { + if (wizard != null) { + return wizard.getReinstallOp(); + } else if (attachWizard != null) { + return attachWizard.getReinstallOp(); + } else { + return true; + } + } + + public boolean getSelectPkgOp() { + if (wizard != null) { + return wizard.getSelectPkgOp(); + } else if (attachWizard != null) { + return attachWizard.getSelectPkgOp(); + } else { + return true; + } + } + + public String getProcName() { + if (attachWizard != null) { + return attachWizard.getProcName(); + } else { + return null; + } + } + + public int getProcId() { + if (attachWizard != null) { + return attachWizard.getPid(); + } else { + return -1; + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowLogDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowLogDialog.java new file mode 100644 index 0000000..2298a2f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowLogDialog.java @@ -0,0 +1,110 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizards; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class ShowLogDialog extends Dialog { + + private int x = 0; + private int y = 0; + private final int width = 700; + private final int height = 500; + private Shell shell; + private String desc = ""; + private String log = ""; + + protected ShowLogDialog(Shell parentShell, String desc, String log) { + super(parentShell); + this.shell = parentShell; + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + + this.desc = desc; + this.log = log; + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText("Show Log"); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + createDescComposite(composite); + createTextAreaComposite(composite); + return null; + } + + private void createDescComposite(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); + composite.setLayout(new GridLayout(1, false)); + + Label message = new Label(composite, SWT.NONE); + message.setText(desc); + } + + private void createTextAreaComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + Text text = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL); + GridData gridData = new GridData(GridData.FILL_BOTH); + text.setLayoutData(gridData); + text.setText(log); + } + + protected void createButtonsForButtonBar(Composite parent) + { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowPackageStatusDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowPackageStatusDialog.java new file mode 100644 index 0000000..6dc6db7 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/launch/wizards/ShowPackageStatusDialog.java @@ -0,0 +1,326 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.launch.wizards; + +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.tizen.nativeplatform.pkgmgr.model.LocalPackage; +import org.tizen.nativeplatform.pkgmgr.model.Package; + +public class ShowPackageStatusDialog extends Dialog { + + private final String BUNDLE_NAME = ShowPackageStatusDialog.class.getPackage().getName() + ".LaunchWizardUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private int x = 0; + private int y = 0; + private final int width = 800; + private final int height = 700; + + private TableViewer bsViewer; + private TableViewer dvViewer; + private ArrayList bsPackages = new ArrayList(); + private ArrayList dvPackages = new ArrayList(); + private ArrayList selectedBsPackages = new ArrayList(); + private ArrayList selectedDvPackages = new ArrayList(); + + public ShowPackageStatusDialog(Shell parentShell, + ArrayList bsPkgs, ArrayList dvPkgs) { + super(parentShell); + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + + this.bsPackages = bsPkgs; + this.dvPackages = dvPkgs; + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("PkgDialog.Title")); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + createDescComposite(composite); + createBuildSystemLabelComposite(composite); + createBuildSystemComposite(composite); + createDeviceLabelComposite(composite); + createDeviceComposite(composite); + tableRefresh(); + return null; + } + + private void createDescComposite(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); + composite.setLayout(new GridLayout(1, false)); + + Label message = new Label(composite, SWT.NONE); + message.setText(resources.getString("PkgDialog.Desc")); + } + + @Override + protected void okPressed() { + selectedBsPackages.clear(); + selectedDvPackages.clear(); + + int recentTableIndex = bsViewer.getTable().getItemCount(); + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = null; + item = bsViewer.getTable().getItem(i); + LocalPackage pkg = (LocalPackage)item.getData(); + if (pkg.getCheckColumn()) { + selectedBsPackages.add(pkg); + } + } + + recentTableIndex = dvViewer.getTable().getItemCount(); + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = null; + item = dvViewer.getTable().getItem(i); + LocalPackage pkg = (LocalPackage)item.getData(); + if (pkg.getCheckColumn()) { + selectedDvPackages.add(pkg); + } + } + + super.okPressed(); + } + + @Override + protected void cancelPressed() { + super.cancelPressed(); + } + + public ArrayList getSelectedBsPkgs() { + return selectedBsPackages; + } + + public ArrayList getSelectedDvPkgs() { + return selectedDvPackages; + } + + private void createBuildSystemLabelComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); + composite.setLayout(new GridLayout(1, false)); + + Label tableDesc = new Label(composite, SWT.NONE); + tableDesc.setText(resources.getString("PkgDialog.Label.Buildsystem")); + } + + private void createBuildSystemComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new FillLayout()); + + bsViewer = new TableViewer( composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK ); + createColumns( composite, bsViewer); + Table packageTable = bsViewer.getTable(); + packageTable.addListener( SWT.Selection, new Listener(){ + + @Override + public void handleEvent(Event event) { + if( event.detail == SWT.CHECK ) + { + Package pkg = (Package)event.item.getData(); + pkg.setCheckColumn( !pkg.getCheckColumn() ); + } + } + }); + + packageTable.setHeaderVisible(true); + packageTable.setLinesVisible(true); + + bsViewer.setContentProvider(new ArrayContentProvider()); + bsViewer.setInput(bsPackages); + } + + private void createDeviceLabelComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); + composite.setLayout(new GridLayout(1, false)); + + Label tableDesc = new Label(composite, SWT.NONE); + tableDesc.setText(resources.getString("PkgDialog.Label.Device")); + } + + private void createDeviceComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new FillLayout()); + + dvViewer = new TableViewer( composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK ); + createColumns( composite, dvViewer); + Table packageTable = dvViewer.getTable(); + packageTable.addListener( SWT.Selection, new Listener(){ + + @Override + public void handleEvent(Event event) { + if( event.detail == SWT.CHECK ) + { + Package pkg = (Package)event.item.getData(); + pkg.setCheckColumn( !pkg.getCheckColumn() ); + } + } + }); + + packageTable.setHeaderVisible(true); + packageTable.setLinesVisible(true); + + dvViewer.setContentProvider(new ArrayContentProvider()); + dvViewer.setInput(dvPackages); + } + + protected void createButtonsForButtonBar(Composite parent) + { + createButton(parent, IDialogConstants.OK_ID, "Continue", true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + } + + private void createColumns( Composite parent, TableViewer viewer ) + { + String[] titles = {"Package Name", "Arch", "New Version", "Installed Version", "Status"}; + int[] bounds = {250, 60, 150, 150, 150}; + + TableViewerColumn colPackage = createTableViewerColumn( viewer, titles[0], bounds[0], SWT.NONE); + + colPackage.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + return pkg.getName(); + } + }); + + TableViewerColumn colArch = createTableViewerColumn( viewer, titles[1], bounds[1], SWT.NONE); + + colArch.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String arch = pkg.getArch(); + return arch; + } + }); + + TableViewerColumn colNewVer = createTableViewerColumn( viewer, titles[2], bounds[2], SWT.NONE); + + colNewVer.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String newVer = pkg.getNewVersion(); + return newVer; + } + }); + + TableViewerColumn colInsVer = createTableViewerColumn( viewer, titles[3], bounds[3], SWT.NONE); + colInsVer.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String installedVer = pkg.getInstalledVersion(); + return installedVer; + } + }); + + TableViewerColumn colStatus = createTableViewerColumn( viewer, titles[4], bounds[4], SWT.NONE); + + colStatus.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String status = pkg.getInstallInfo().toString(); + return status; + } + }); + } + + private TableViewerColumn createTableViewerColumn(TableViewer viewer, String title, int bound, int Style) { + + final TableViewerColumn viewerColumn = new TableViewerColumn( viewer, Style); + final TableColumn column = viewerColumn.getColumn(); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(true); + return viewerColumn; + } + + private void tableRefresh() { + int recentTableIndex = bsViewer.getTable().getItemCount(); + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = null; + item = bsViewer.getTable().getItem(i); + Package pkg = (Package)item.getData(); + item.setChecked(pkg.getCheckColumn()); + } + + recentTableIndex = dvViewer.getTable().getItemCount(); + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = null; + item = dvViewer.getTable().getItem(i); + Package pkg = (Package)item.getData(); + item.setChecked(pkg.getCheckColumn()); + } + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswdDialogMessage.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswdDialogMessage.properties new file mode 100644 index 0000000..a0a5cd4 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswdDialogMessage.properties @@ -0,0 +1,3 @@ +PwInputDialog.Desc=RPM packaging requires super-user authority.\nPlease enter your password to perform administrative tasks.\n(You can edit it on "Windows -> Preferences -> Tizen SDK -> Platform") +PwInputDialog.InputLabel=Password: +PwInputDialog.CheckSave=Remember this and do not ask again. \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswordInputDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswordInputDialog.java new file mode 100644 index 0000000..1d02e2d --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/PasswordInputDialog.java @@ -0,0 +1,174 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.password; + +import java.util.ResourceBundle; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +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.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + + +public class PasswordInputDialog extends Dialog { + private Text textPass; + private Button checkPass; + private String title = null; + private String password = null; + private boolean isSavePass; + + private static final String BUNDLE_NAME = PasswordInputDialog.class.getPackage().getName() + ".PasswdDialogMessage";//$NON-NLS-1$ + public static ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + public PasswordInputDialog(Shell parentShell, String title) { + super(parentShell); + this.title = title; + } + + @Override + protected void configureShell(Shell shell) { + super.configureShell(shell); + if (title != null) { + shell.setText(title); + } + } + + @Override + protected Control createDialogArea(Composite parent) { + // create composite + Composite composite = (Composite) super.createDialogArea(parent); + + // create message + Label labelDesc = new Label(composite, SWT.WRAP); + labelDesc.setText(resources.getString("PwInputDialog.Desc")); + GridData data = new GridData(GridData.GRAB_HORIZONTAL + | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL + | GridData.VERTICAL_ALIGN_CENTER); + data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); + labelDesc.setLayoutData(data); + labelDesc.setFont(parent.getFont()); + + Composite compositeInpu = new Composite(composite, SWT.NONE); + compositeInpu.setLayout(new GridLayout(2,false)); + compositeInpu.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + Label labelPass = new Label(compositeInpu, SWT.WRAP); + labelPass.setText(resources.getString("PwInputDialog.InputLabel")); + GridData passLabelGD = new GridData( GridData.GRAB_VERTICAL + | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); + data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); + labelPass.setLayoutData(passLabelGD); + labelPass.setFont(parent.getFont()); + + textPass = new Text(compositeInpu,SWT.SINGLE | SWT.BORDER | SWT.PASSWORD); + textPass.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + Text textEmpty = new Text(composite, SWT.READ_ONLY | SWT.WRAP); + textEmpty.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); + textEmpty.setVisible(false); + + applyDialogFont(composite); + return composite; + } + + /** + * Adds buttons to this dialog's button bar. + *

+ * The Dialog implementation of this framework method adds + * standard ok and cancel buttons using the createButton + * framework method. These standard buttons will be accessible from + * getCancelButton, and getOKButton. + * Subclasses may override. + *

+ * + * @param parent + * the button bar composite + */ + @Override + protected void createButtonsForButtonBar(Composite parent) { + ((GridData) parent.getLayoutData()).horizontalAlignment = SWT.FILL; + ((GridData) parent.getLayoutData()).grabExcessHorizontalSpace = true; + ((GridLayout) parent.getLayout()).numColumns++; + ((GridLayout) parent.getLayout()).makeColumnsEqualWidth = false; + + checkPass = new Button(parent, SWT.CHECK); + checkPass.setText(resources.getString("PwInputDialog.CheckSave")); + checkPass.setFont(JFaceResources.getDialogFont()); + checkPass.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true)); + + // create OK and Cancel buttons by default + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); + } + + /** + * Set the layout data of the button to a GridData with appropriate heights + * and widths. + * + * @param button + */ + @Override + protected void setButtonLayoutData(Button button) { + GridData data = new GridData(SWT.CENTER, SWT.CENTER, false, false); + int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); + Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); + data.widthHint = Math.max(widthHint, minSize.x); + button.setLayoutData(data); + } + + @Override + protected void okPressed() { + password = textPass.getText(); + isSavePass = checkPass.getSelection(); + super.okPressed(); + } + + @Override + protected void cancelPressed() { + password = null; + isSavePass = false; + super.cancelPressed(); + } + + public String getPassword() { + return password; + } + public boolean isSavePassword(){ + return isSavePass; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/SudoPasswdManager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/SudoPasswdManager.java new file mode 100644 index 0000000..3305070 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/password/SudoPasswdManager.java @@ -0,0 +1,63 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.password; + +import org.eclipse.jface.window.Window; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public class SudoPasswdManager { + private SudoPasswdManager() { + } + + public static String getSudoPassword() { + if (PreferencesManager.getPassword().isEmpty() || PreferencesManager.getPassword() == null) { + openPasswordDialog(); + } + + return PreferencesManager.getPassword(); + } + + public static void openPasswordDialog(){ + + Display display = PlatformUI.getWorkbench().getDisplay(); + display.syncExec(new Runnable() { + @Override + public void run() { + Shell shell = PlatformUI.getWorkbench().getDisplay().getShells()[0]; + PasswordInputDialog passwordDialog = new PasswordInputDialog(shell, "Input password"); + if( passwordDialog.open() == Window.OK){ + PreferencesManager.setPassword(passwordDialog.getPassword()); + } + } + }); + } +} + diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/DialogActionDelegate.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/DialogActionDelegate.java new file mode 100644 index 0000000..0c4c989 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/DialogActionDelegate.java @@ -0,0 +1,123 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr; + +import java.util.ResourceBundle; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.nativecommon.build.CurrentEnabledProject; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.pkgmgr.ui.RPMPackageDialog; +import org.tizen.sdblib.IDevice; + +public class DialogActionDelegate implements IWorkbenchWindowActionDelegate { + + private IWorkbenchWindow window; + + private SmartBuildInterface sbi = null; + private final String BUNDLE_NAME = DialogActionDelegate.class.getPackage().getName() + ".RPMPackageCommands"; + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + @Override + public void run(IAction action) { + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + String target = null; + boolean enableRootstrap = true; + boolean enableTarget = true; + + IProject project = CurrentEnabledProject.getCurrentProject(); + Shell shell = window.getShell(); + if (project == null) { + MessageDialog.openError(shell, "Error", resources.getString("PkgMgr.Error.Noselected.Project")); + return; + } + sbi = SmartBuildInterface.getInstance(project); + + IConfiguration cfg = ManagedBuildManager.getBuildInfo( project ).getDefaultConfiguration(); + String targetName = PlatformConfigurationManager.getBuildTargetName(cfg); + + IManagedProject managedProject = cfg.getManagedProject(); + String projectArtifactType = managedProject.getProjectType().getBuildArtefactType().getId(); + if (!projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE)) { + MessageDialog.openError(shell, "Error", resources.getString("PkgMgr.Error.Not.Platformproject")); + return; + } + + if (device == null) { + enableTarget = false; + } else { + target = device.getSerialNumber(); + if (target == null) { + enableTarget = false; + } + } + + String result = ""; + try { + result = sbi.queryStdOut("command", targetName, null); + } catch (SBIException e) { + e.printStackTrace(); + } + if (!result.contains("passwd")) { + MessageDialog.openError(shell, "Error", resources.getString("PkgMgr.Error.Not.SupportedRpm")); + return; + } + RPMPackageDialog pkgdlg = new RPMPackageDialog(window.getShell(), target, enableRootstrap, enableTarget); + pkgdlg.open(); + } + + @Override + public void selectionChanged(IAction action, ISelection selection) { + // TODO Auto-generated method stub + + } + + @Override + public void dispose() { + // TODO Auto-generated method stub + + } + + @Override + public void init(IWorkbenchWindow window) { + this.window = window; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerHandler.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerHandler.java new file mode 100644 index 0000000..11a3efc --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerHandler.java @@ -0,0 +1,125 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr; + +import java.util.ResourceBundle; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.handlers.HandlerUtil; + +import org.tizen.common.connection.ConnectionPlugin; + +import org.tizen.nativeplatform.pkgmgr.ui.RPMPackageDialog; +import org.tizen.nativecommon.build.CurrentEnabledProject; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.sdblib.IDevice; + +/** + * Our sample handler extends AbstractHandler, an IHandler base class. + * @see org.eclipse.core.commands.IHandler + * @see org.eclipse.core.commands.AbstractHandler + */ +public class PackageManagerHandler extends AbstractHandler { + + private SmartBuildInterface sbi = null; + + private final String BUNDLE_NAME = PackageManagerHandler.class.getPackage().getName() + ".RPMPackageCommands"; + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + /** + * The constructor. + */ + public PackageManagerHandler() { + } + + /** + * the command has been executed, so extract extract the needed information + * from the application context. + */ + public Object execute(ExecutionEvent event) throws ExecutionException { + + IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); + IDevice device = ConnectionPlugin.getDefault().getCurrentDevice(); + String target = null; + boolean enableRootstrap = true; + boolean enableTarget = true; + + IProject project = CurrentEnabledProject.getCurrentProject(); + Shell shell = window.getShell(); + if (project == null) { + MessageDialog.openError(shell, "Error", resources.getString("PkgMgr.Error.Noselected.Project")); + return null; + } + sbi = SmartBuildInterface.getInstance(project); + + IConfiguration cfg = ManagedBuildManager.getBuildInfo( project ).getDefaultConfiguration(); + String targetName = PlatformConfigurationManager.getBuildTargetName(cfg); + + IManagedProject managedProject = cfg.getManagedProject(); + String projectArtifactType = managedProject.getProjectType().getBuildArtefactType().getId(); + if (!projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE)) { + MessageDialog.openError(shell, "Error", resources.getString("PkgMgr.Error.Not.Platformproject")); + return null; + } + + if (device == null) { + enableTarget = false; + } else { + target = device.getSerialNumber(); + if (target == null) { + enableTarget = false; + } + } + + String result = ""; + try { + result = sbi.queryStdOut("command", targetName, null); + } catch (SBIException e) { + e.printStackTrace(); + } + if (!result.contains("passwd")) { + MessageDialog.openError(shell, "Error", resources.getString("PkgMgr.Error.Not.SupportedRpm")); + return null; + } + RPMPackageDialog pkgdlg = new RPMPackageDialog(window.getShell(), target, enableRootstrap, enableTarget); + pkgdlg.open(); + + return null; + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerOuputReceiver.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerOuputReceiver.java new file mode 100644 index 0000000..45d5a4f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/PackageManagerOuputReceiver.java @@ -0,0 +1,91 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr; + +import java.util.ArrayList; + +import org.eclipse.ui.console.MessageConsoleStream; + +import org.tizen.sdblib.MultiLineReceiver; + +public class PackageManagerOuputReceiver extends MultiLineReceiver { + + public boolean isCancelled = false; + private boolean printConsole = true; + private ArrayList log = null; + private MessageConsoleStream mcs = null; + + public PackageManagerOuputReceiver() { + super(); + + setTrimLine(false); + } + + public void setMessageConsoleStream(MessageConsoleStream mcs) { + this.mcs = mcs; + } + + public void setPrintConsole(boolean b) { + printConsole = b; + } + + @Override + public void processNewLines(String[] lines) { + if (isCancelled == false) { + //processLogLines(lines); + for( String line: lines ) { + if ( log == null ) { + log = new ArrayList(); + } + log.add(line); + } + if (printConsole) { + for (String line : lines) { + if (line.endsWith("\n")) { + mcs.print(line); + } else { + mcs.println(line); + } + } + } + } + } + + public String[] getLog() { + return log.toArray(new String[0]); + } + + public void cleanLog() { + log = null; + } + + public boolean isCancelled() { + return isCancelled; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommander.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommander.java new file mode 100644 index 0000000..ab7169a --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommander.java @@ -0,0 +1,915 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.ResourceBundle; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import java.util.Enumeration; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.ui.console.MessageConsoleStream; +import org.tizen.common.ui.view.console.ConsoleManager; +import org.tizen.common.util.FileUtil; +import org.tizen.nativeplatform.pkgmgr.PackageManagerOuputReceiver; +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.util.CommandLauncher; +import org.tizen.sdblib.IDevice; +import org.tizen.sdblib.IShellOutputReceiver; +import org.tizen.sdblib.SdbCommandRejectedException; +import org.tizen.sdblib.ShellCommandUnresponsiveException; +import org.tizen.sdblib.SyncService; +import org.tizen.sdblib.SyncService.SyncResult; +import org.tizen.sdblib.TimeoutException; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +public class RPMPackageCommander { + + private final static int MAX_TIMEOUT = 10000; + private static String http_proxy = ""; + private static final String REMOVE_PKGS = "rpm-x86-arm"; + + private static final String BUNDLE_NAME = RPMPackageCommander.class + .getPackage().getName() + ".RPMPackageCommands"; + private static ResourceBundle resources = ResourceBundle + .getBundle(BUNDLE_NAME); + + public RPMPackageCommander() { + } + + public static void setHttpProxy(String proxy) { + http_proxy = proxy; + } + + public static void DistUpgradeRootstrap(String path, + IProgressMonitor monitor) throws InterruptedException { + + actionBeforeUseZypper(path); + + String command = getChrootedCommand(path, String.format("%s;%s;%s", + getProxyCmd(), getResetDbCmd(), getDistUpgradeCmd())); + + CommandLauncher + .executeSudo(command, null, "Platform Internal", monitor); + } + + public static void InstallLocalPkgToRootstrap(ArrayList fileList, + String path, IProgressMonitor monitor) throws InterruptedException { + + actionBeforeUseZypper(path); + + // copy + ArrayList fileListOnRootstrap = new ArrayList(); + for (String filePath : fileList) { + String filename = new File(filePath).getName(); + String pathOnRootstrap = "/tmp/" + filename; + try { + FileUtil.copyTo(filePath, path + pathOnRootstrap); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + fileListOnRootstrap.add(pathOnRootstrap); + } + + // install + String cmd = String.format("%s;%s", getResetDbCmd(), + getInstallLocalPkgCmd(fileListOnRootstrap)); + String command = getChrootedCommand(path, cmd); + CommandLauncher + .executeSudo(command, null, "Platform Internal", monitor); + } + + public static void InstallLocalPkgToDevice(ArrayList fileList, + IDevice device) { + actionBeforeUseZypperDevice(device); + + // copy + ArrayList fileListOnDevice = new ArrayList(); + for (String filePath : fileList) { + String filename = new File(filePath).getName(); + String pathOnDevice = "/tmp/" + filename; + SyncService syncService; + try { + syncService = device.getSyncService(); + } catch (TimeoutException e) { + e.printStackTrace(); + continue; + } catch (SdbCommandRejectedException e) { + e.printStackTrace(); + continue; + } catch (IOException e) { + e.printStackTrace(); + continue; + } + SyncResult syncResult = syncService.pushFile(filePath, + pathOnDevice, SyncService.getNullProgressMonitor()); + if (syncResult.getCode() != SyncService.RESULT_OK) { + continue; + } + fileListOnDevice.add(pathOnDevice); + } + + // set update mode + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + //rec.cleanLog(); + if (!device.isEmulator()) { + RPMPackageCommander.changeUpdateModeForDevice(device, rec); + } + + // install + String command = String.format("%s;%s", getResetDbCmd(), + getInstallLocalPkgCmdWithRPM(fileListOnDevice)); + executeDeviceShellCommand(device, command, rec); + } + + + private static void executeDeviceShellCommand( IDevice device, + String command, IShellOutputReceiver rec ) { + try { + device.executeShellCommand(command, rec, MAX_TIMEOUT ); + } catch (TimeoutException e) { + e.printStackTrace(); + } catch (SdbCommandRejectedException e) { + e.printStackTrace(); + } catch (ShellCommandUnresponsiveException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + public static Document InstallPkgWithZypperXmlOut(String path, String pkgs, + boolean refresh, boolean force) { + String log = ""; + if (refresh) { + refreshRepositoryForRootstrap(path); + } + String basicOp = "--xmlout --non-interactive"; + String additionOp = ""; + if (force) { + additionOp = "--force"; + } + String cmd = String.format("%s;%s", getProxyCmd(), + getInstallPkgWithZypper(basicOp, additionOp, pkgs)); + String command = getChrootedCommand(path, cmd); + + log = executeSudoOutputCommand(command, null, true); + + if (log.contains(" pkgList, String path, + IProgressMonitor monitor) throws InterruptedException { + + String cmd = String.format("%s;%s", getResetDbCmd(), + getUninstallPkgCmd(pkgList)); + String command = getChrootedCommand(path, cmd); + + CommandLauncher + .executeSudo(command, null, "Platform Internal", monitor); + } + + public static void uninstallPkgFromDevice( + CopyOnWriteArrayList pkgList, IDevice device) { + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + String command = String.format("%s;%s;%s", getProxyCmd(), + getResetDbCmd(), getUninstallPkgCmd(pkgList)); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + } + + public static void UninstallPkgFromRootstrapNoDeps(String fileList, + String path) { + + String cmd = String.format("%s;%s", getResetDbCmd(), + getUninstallPkgCmdNoDeps(fileList)); + String command = getChrootedCommand(path, cmd); + + try { + CommandLauncher.executeSudo(command, null, "Platform Internal", + null); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public static String getArchForFile(String filePath) { + try { + return CommandLauncher.executeOutput(getQueryInfoCmd("ARCH", + filePath)); + } catch (InterruptedException e) { + return ""; + } + } + + public static String getPkgNameForFile(String filePath) { + try { + return CommandLauncher.executeOutput(getQueryInfoCmd("NAME", + filePath)); + } catch (InterruptedException e) { + return ""; + } + } + + public static String getPkgVerForFile(String filePath) { + String version; + String release; + try { + version = CommandLauncher.executeOutput(getQueryInfoCmd("VERSION", + filePath)); + release = CommandLauncher.executeOutput(getQueryInfoCmd("RELEASE", + filePath)); + } catch (InterruptedException e) { + return ""; + } + + return version + "-" + release; + } + + public static String getPkgInstalledVerForRootstrap(String pkgName, + String path) { + String retStr = ""; + String version = ""; + String release = ""; + + if (!pkgInstalledSuccessfullyForRootstrap(pkgName, path)) { + return retStr; + } + + String result = null; + String cmd = String.format("%s;%s", getResetDbCmd(), + getShowPkgInfoCmd(pkgName)); + String command = getChrootedCommand(path, cmd); + + result = executeSudoOutputCommand(command); + + String[] splitResult = result.split("\n"); + for (String r : splitResult) { + if (r.trim().startsWith("Version")) { + version = r.split(":")[1].trim(); + } else if (r.trim().startsWith("Release")) { + release = r.split(":")[1].trim(); + } + } + + retStr = version + "-" + release; + return retStr; + } + + public static String getPkgInstalledVerForDevice(String pkgName, + IDevice device, PackageManagerOuputReceiver rec) { + String retStr = ""; + String version = ""; + String release = ""; + + if (device != null) { + if (!pkgInstalledSuccessfullyForDevice(pkgName, device, rec)) { + return retStr; + } + + String command = String.format("%s;%s", getResetDbCmd(), + getShowPkgInfoCmd(pkgName)); + rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + for (String l : rec.getLog()) { + if (l.trim().startsWith("Version")) { + version = l.split(":")[1].trim(); + } else if (l.trim().startsWith("Release")) { + release = l.split(":")[1].trim(); + } + } + } + + retStr = version + "-" + release; + return retStr; + } + + public static boolean pkgInstalledSuccessfullyForRootstrap(String pkgName, + String path) { + + boolean ret = false; + String result = ""; + + String cmd = String.format("%s;%s", getResetDbCmd(), + getShowPkgCmd(pkgName)); + String command = getChrootedCommand(path, cmd); + + result = executeSudoOutputCommand(command); + + if (!result.isEmpty() && result.contains(pkgName)) { + ret = true; + } + + return ret; + } + + public static boolean pkgInstalledSuccessfullyForDevice(String pkgName, + IDevice device, PackageManagerOuputReceiver rec) { + + boolean ret = false; + + if (device != null) { + String command = String.format("%s;%s", getResetDbCmd(), + getShowPkgCmd(pkgName)); + executeDeviceShellCommand(device, command, rec); + } + + if (rec.getLog() == null) { + return false; + } + + for (String l : rec.getLog()) { + if (l.contains(pkgName)) { + ret = true; + } + } + + return ret; + } + + public static ArrayList getPackageListForRootstrap(String path, + IProgressMonitor monitor) throws InterruptedException { + + ArrayList packageList = new ArrayList(); + Hashtable packageHash = new Hashtable(); + + // get list using zypper + String cmd = String.format("%s;%s;%s", getProxyCmd(), getResetDbCmd(), + getRemotePkgListCmd()); + String command = getChrootedCommand(path, cmd); + String result = CommandLauncher.executeSudoOutput(command, null, false, + monitor); + String[] splitStr = result.split("\n"); + for (String s : splitStr) { + s = s.replaceAll(" ", ""); + String[] part = s.split("\\|"); + if (part.length == 5 && !part[0].equals("S")) { + String name = part[2]; + String version = part[3]; + String arch = part[4]; + if (part[0].equals("i")) { + packageHash.put(name, new Package(name, version, version, + arch)); + } else if (part[0].equals("v")) { + Package p = packageHash.get(name); + if (p != null) { + if (version.compareTo(p.getNewVersion()) > 0) { + p.setNewVersion(version); + } + } else { + packageHash.put(name, new Package(name, version, + version, arch)); + } + } else { + packageHash.put(name, new Package(name, "", version, arch)); + } + } + } + + // get installed packages using rpm + cmd = String.format("%s;%s", getResetDbCmd(), getInstalledPkgListCmd()); + command = getChrootedCommand(path, cmd); + result = CommandLauncher.executeSudoOutput(command); + splitStr = result.split("\n"); + for (String s : splitStr) { + s = s.replaceAll(" ", "").trim(); + String[] part = s.split(","); + if (part.length == 3) { + String name = part[0]; + String version = part[1]; + String arch = part[2]; + Package pkg = packageHash.get(name); + if (pkg == null) { + packageHash.put(name, new Package(name, version, "", arch)); + } else { + pkg.setInstalledVersion(version); + } + } + } + + Enumeration e = packageHash.elements(); + while (e.hasMoreElements()) { + packageList.add(e.nextElement()); + } + + return packageList; + } + + public static ArrayList getPackageListForDevice(IDevice device) { + actionBeforeUseZypperDevice(device); + + ArrayList packageList = new ArrayList(); + Hashtable packageHash = new Hashtable(); + PackageManagerOuputReceiver rec = getNewOuputReceiver(); + rec.setPrintConsole(false); + + // get list using zypper + String command = String.format("%s;%s;%s", getProxyCmd(), + getResetDbCmd(), getRemotePkgListCmd()); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + for (String s : rec.getLog()) { + s = s.replaceAll(" ", ""); + String[] part = s.split("\\|"); + if (part.length == 5 && !part[0].equals("S")) { + String name = part[2]; + String version = part[3]; + String arch = part[4]; + if (part[0].equals("i")) { + packageHash.put(name, new Package(name, version, + version, arch)); + } else if (part[0].equals("v")) { + Package p = packageHash.get(name); + if (p != null + && version.compareTo(p.getNewVersion()) > 0) { + p.setNewVersion(version); + } else { + packageHash.put(name, new Package(name, "", + version, arch)); + } + } else { + packageHash.put(name, new Package(name, "", version, + arch)); + } + } + } + + // get installed packages using rpm + command = String.format("%s;%s", getResetDbCmd(), + getInstalledPkgListCmdDevice()); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + for (String s : rec.getLog()) { + s = s.replaceAll(" ", "").trim(); + String[] part = s.split(","); + if (part.length == 3) { + String name = part[0]; + String version = part[1]; + String arch = part[2]; + Package pkg = packageHash.get(name); + if (pkg == null) { + packageHash.put(name, new Package(name, version, "", + arch)); + } else { + pkg.setInstalledVersion(version); + } + } + } + + Enumeration e = packageHash.elements(); + while (e.hasMoreElements()) { + packageList.add(e.nextElement()); + } + + return packageList; + } + + public static void resetRepositoryForRootstrap(String path) { + String cmd = String.format("%s", getRepoResetCmd()); + String command = getChrootedCommand(path, cmd); + + executeSudoOutputCommand(command); + } + + public static Hashtable getRepositoryListForDevice( + IDevice device) { + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + Hashtable reposHash = new Hashtable(); + + String command = String.format("%s;%s", getResetDbCmd(), + getRepoListCmd()); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + + for (String reposStr : rec.getLog()) { + reposStr = reposStr.replaceAll(" ", ""); + String[] part = reposStr.split("\\|"); + if (part.length == 6 && !part[0].equals("#")) { + reposHash.put(part[1], part[5]); + } + } + + return reposHash; + } + + public static String refreshRepositoryForRootstrap(String path) { + + String result = ""; + String cmd = String.format("%s;%s;%s", getProxyCmd(), getResetDbCmd(), + getRefreshCmd()); + String command = getChrootedCommand(path, cmd); + + try { + CommandLauncher.executeSudo(command, null, "Platform Internal", null); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return result; + } + + public static void refreshRepositoryForDevice(IDevice device) { + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + String command = String.format("%s;%s;%s", getProxyCmd(), + getResetDbCmd(), getRefreshCmd()); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + } + + public static String addRepositoryForRootstrap(String name, String uri, + String path) { + + String result = ""; + String cmd = String.format("%s;%s", getResetDbCmd(), + getAddRepoCmd(uri, name)); + String command = getChrootedCommand(path, cmd); + + result = executeSudoOutputCommand(command); + + return result; + } + + public static void addRepositoryForDevice(String name, String uri, + IDevice device) { + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + String command = String.format("%s;%s", getResetDbCmd(), + getAddRepoCmd(uri, name)); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + } + + public static String removeRepositoryForRootstrap(String name, String path) { + + String cmd = String.format("%s;%s", getResetDbCmd(), + getRemoveRepoCmd(name)); + String command = getChrootedCommand(path, cmd); + + return executeSudoOutputCommand(command); + } + + public static void removeRepositoryForDevice(String name, IDevice device) { + + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + String command = String.format("%s;%s", getResetDbCmd(), + getRemoveRepoCmd(name)); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + } + + public static void installRemotePkgForRootstrap( + CopyOnWriteArrayList selectedList, String path, + IProgressMonitor monitor) throws InterruptedException { + + actionBeforeUseZypper(path); + + String cmd = String.format("%s;%s;%s", getProxyCmd(), getResetDbCmd(), + getInstallPkgCmd(selectedList)); + String command = getChrootedCommand(path, cmd); + + CommandLauncher + .executeSudo(command, null, "Platform Internal", monitor); + } + + public static void installRemotePkgForDevice( + CopyOnWriteArrayList selectedList, IDevice device) { + + PackageManagerOuputReceiver rec = getNewOuputReceiverWithConsole(); + String command = String.format("%s;%s;%s", getProxyCmd(), + getResetDbCmd(), getInstallPkgCmd(selectedList)); + //rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + } + + private static void changeUpdateModeForDevice(IDevice device, + PackageManagerOuputReceiver rec) { + + String command = resources.getString("Command.Change.Updatemode"); + rec.cleanLog(); + executeDeviceShellCommand(device, command, rec); + } + + private static void actionBeforeUseZypper(String path) { + if (pkgInstalledSuccessfullyForRootstrap(REMOVE_PKGS, path)) { + UninstallPkgFromRootstrapNoDeps(REMOVE_PKGS, path); + } + } + + private static void actionBeforeUseZypperDevice(IDevice device) { + if (device.isEmulator()) { + PackageManagerOuputReceiver rec = getNewOuputReceiver(); + //rec.cleanLog(); + String command = String + .format("sed -i \"s/# arch = s390/arch = i686/g\" /etc/zypp/zypp.conf"); + executeDeviceShellCommand(device, command, rec); + } + } + + private static String getProxyCmd() { + return String.format(resources.getString("Command.Export.Proxy"), + http_proxy); + } + + private static String getResetDbCmd() { + return String.format(resources.getString("Command.Reset.Db")); + } + + private static String getDistUpgradeCmd() { + return String.format(resources.getString("Command.DistUpgrade")); + } + + private static String getInstallPkgCmd(CopyOnWriteArrayList pkgList) { + String pkgListStr = ""; + for (Package pkg : pkgList) { + pkgListStr = pkgListStr.isEmpty() ? pkg.getName() : pkgListStr + + " " + pkg.getName(); + } + return String.format(resources.getString("Command.Install.Remote.Pkg"), + pkgListStr); + } + + private static String getInstallLocalPkgCmd(ArrayList fileList) { + String pkgListStr = ""; + for (String filePath : fileList) { + pkgListStr = pkgListStr.isEmpty() ? filePath : pkgListStr + " " + + filePath; + } + return String.format(resources.getString("Command.Install.Local.Pkg"), + pkgListStr); + } + + private static String getInstallLocalPkgCmdWithRPM( + ArrayList fileList) { + String pkgListStr = ""; + for (String filePath : fileList) { + pkgListStr = pkgListStr.isEmpty() ? filePath : pkgListStr + " " + + filePath; + } + return String.format( + resources.getString("Command.Install.Local.Pkg.RPM"), + pkgListStr); + } + + private static String getUninstallPkgCmd( + CopyOnWriteArrayList pkgList) { + String pkgListStr = ""; + for (Package pkg : pkgList) { + pkgListStr = pkgListStr.isEmpty() ? pkg.getName() : pkgListStr + + " " + pkg.getName(); + } + return String.format(resources.getString("Command.Uninstall.Pkg"), + pkgListStr); + } + + private static String getUninstallPkgCmdNoDeps(String pkgList) { + return String.format( + resources.getString("Command.Uninstall.Pkg.NoDeps"), pkgList); + } + + private static String getRemoveRepoCmd(String name) { + return String.format(resources.getString("Command.Remove.Repo"), name); + } + + private static String getAddRepoCmd(String uri, String name) { + return String + .format(resources.getString("Command.Add.Repo"), uri, name); + } + + private static String getRefreshCmd() { + return resources.getString("Command.Refresh.Repo"); + } + + private static String getRepoListCmd() { + return resources.getString("Command.List.Repo"); + } + + private static String getRepoResetCmd() { + return resources.getString("Command.Reset.Repo"); + } + + private static String getRemotePkgListCmd() { + return resources.getString("Command.List.Remote.Pkg"); + } + + private static String getInstalledPkgListCmd() { + return resources.getString("Command.List.Installed.Pkg"); + } + + private static String getInstalledPkgListCmdDevice() { + return resources.getString("Command.List.Installed.Pkg.Device"); + } + + private static String getShowPkgCmd(String name) { + return String.format(resources.getString("Command.Show.Pkg"), name); + } + + private static String getShowPkgInfoCmd(String name) { + return String + .format(resources.getString("Command.Show.Info.Pkg"), name); + } + + private static String getQueryInfoCmd(String tag, String name) { + return String.format(resources.getString("Command.Info.Pkg.File"), tag, + name); + } + + private static String getInstallPkgWithZypper(String basicOp, + String additionOp, String pkgs) { + return String.format( + resources.getString("Command.Install.Pkg.WithZypper"), basicOp, + additionOp, pkgs); + } + + private static String getChrootedCommand(String path, String cmd) { + return String.format("sudo -S chroot %s sh -c \\\"%s\\\"", path, cmd); + } + + public static int compareVersion(String ver1, String ver2) { + ArrayList tokList1 = tokenizeVersionString(ver1); + ArrayList tokList2 = tokenizeVersionString(ver2); + int maxTokens = tokList1.size() > tokList2.size() ? tokList1.size() + : tokList2.size(); + + for (int i = 0; i < maxTokens; i++) { + // check length + if (i == tokList1.size()) { + return -1; + } + if (i == tokList2.size()) { + return 1; + } + + String tok1 = tokList1.get(i); + String tok2 = tokList2.get(i); + + int value1 = -1, value2 = -1; + try { + value1 = Integer.parseInt(tok1); + } catch (NumberFormatException e) { + // do nothing + e.printStackTrace(); + } + + try { + value2 = Integer.parseInt(tok2); + } catch (NumberFormatException e) { + // do nothing + e.printStackTrace(); + } + + if (value1 > value2) { + return 1; + } else if (value1 < value2) { + return -1; + } else { + int result = tok1.compareTo(tok2); + if (result != 0) { + return result; + } + } + } + + return 0; + } + + private static ArrayList tokenizeVersionString(String ver) { + ArrayList result = new ArrayList(); + final int NUM = 0; + final int ALPHA = 1; + final int NONALPHANUM = 2; + int oldStatus = NONALPHANUM; + String buf = ""; + for (int i = 0; i < ver.length(); i++) { + char c = ver.charAt(i); + int newStatus; + if (c >= '0' && c <= '9') { + newStatus = NUM; + } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + newStatus = ALPHA; + } else { + newStatus = NONALPHANUM; + } + + if (oldStatus != newStatus) { + if (!buf.isEmpty()) { + result.add(buf); + } + if (newStatus != NONALPHANUM) { + buf = String.valueOf(c); + } else { + buf = ""; + } + oldStatus = newStatus; + } else { + if (newStatus != NONALPHANUM) { + buf += String.valueOf(c); + } + } + } + if (!buf.isEmpty()) { + result.add(buf); + } + + return result; + } + + static private PackageManagerOuputReceiver getNewOuputReceiver() { + PackageManagerOuputReceiver rec = new PackageManagerOuputReceiver(); + return rec; + } + + static private PackageManagerOuputReceiver getNewOuputReceiverWithConsole() { + return getNewOuputReceiver("Platform Internal"); + } + + static private PackageManagerOuputReceiver getNewOuputReceiver(String consoleName) { + ConsoleManager cm = new ConsoleManager(consoleName, true); + //cm.clear(); + MessageConsoleStream mcs = cm.getMessageConsoleStream(); + PackageManagerOuputReceiver rec = new PackageManagerOuputReceiver(); + rec.setMessageConsoleStream(mcs); + + return rec; + } + + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommands.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommands.properties new file mode 100644 index 0000000..55498e1 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/RPMPackageCommands.properties @@ -0,0 +1,26 @@ +Command.Export.Proxy = export http_proxy=%s +Command.Reset.Db = rm -f /var/lib/rpm/__db* +Command.Install.Remote.Pkg = zypper --non-interactive in %s +Command.Install.Local.Pkg = zypper --non-interactive in --force %s +Command.Install.Local.Pkg.RPM = rpm -ihv %s --ignoreos --force --nodeps --ignorearch +Command.Uninstall.Pkg.NoDeps = rpm -e %s --nodeps +Command.Uninstall.Pkg = zypper --non-interactive remove %s +Command.Remove.Repo = zypper --non-interactive rr %s +Command.Add.Repo = zypper --non-interactive ar %s %s +Command.Refresh.Repo = zypper --non-interactive refresh +Command.List.Repo = zypper lr -u +Command.Reset.Repo = rm -rf /etc/zypp/repos.d/* +Command.List.Remote.Pkg = zypper --non-interactive pa +Command.List.Installed.Pkg = rpm -qa --qf \\\"%{NAME},%{VERSION}-%{RELEASE},%{ARCH}\\n\\\" +Command.List.Installed.Pkg.Device = rpm -qa --qf \"%{NAME},%{VERSION}-%{RELEASE},%{ARCH}\\n\" +Command.Show.Pkg = rpm -qa %s +Command.Show.Info.Pkg = rpm -qi %s +Command.Info.Pkg.File = rpm -qp --qf "%%{%s}\n" %s +Command.Change.Updatemode = /bin/change-booting-mode.sh --update +Command.DistUpgrade = zypper --non-interactive dup +Command.Install.Pkg.WithZypper = zypper %s in %s %s + +PkgMgr.Error.Noselected.Project = No project selected. Select a Tizen platform project. +PkgMgr.Error.Not.Platformproject = The selected project is not a Tizen platform project. +PkgMgr.Error.Not.SupportedRpm = RPM package not supported by the build system. +PkgMgr.Error.Not.RpmProject = The project is not RPM project. diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPackage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPackage.java new file mode 100644 index 0000000..56124a5 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPackage.java @@ -0,0 +1,35 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +public class InstalledPackage extends Package { + + public InstalledPackage() { + super(); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPkgProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPkgProvider.java new file mode 100644 index 0000000..8b8151f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/InstalledPkgProvider.java @@ -0,0 +1,57 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +import java.util.concurrent.CopyOnWriteArrayList; +public enum InstalledPkgProvider { + INSTANCE; + + private CopyOnWriteArrayList pkgs; + private CopyOnWriteArrayList selected_pkgs; + + private InstalledPkgProvider() + { + pkgs = new CopyOnWriteArrayList (); + selected_pkgs = new CopyOnWriteArrayList (); + } + + public void clear() { + pkgs.clear(); + selected_pkgs.clear(); + } + + public CopyOnWriteArrayList getPkgs() + { + return pkgs; + } + + public CopyOnWriteArrayList getSelectedPkgs() + { + return selected_pkgs; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPackage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPackage.java new file mode 100644 index 0000000..5873c01 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPackage.java @@ -0,0 +1,58 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +public class LocalPackage extends Package { + + private String path = ""; + + public LocalPackage() { + super(); + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public LocalPackage clone() { + LocalPackage newPkg = new LocalPackage(); + newPkg.setArch(this.getArch()); + newPkg.setCheckColumn(this.getCheckColumn()); + newPkg.setInstalledVersion(this.getInstalledVersion()); + newPkg.setInstallInfo(this.getInstallInfo()); + newPkg.setName(this.getName()); + newPkg.setNewVersion(this.getNewVersion()); + newPkg.setPath(this.getPath()); + newPkg.setPkgType(this.getPkgType()); + return newPkg; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPkgProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPkgProvider.java new file mode 100644 index 0000000..742fcc4 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/LocalPkgProvider.java @@ -0,0 +1,49 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +import java.util.concurrent.CopyOnWriteArrayList; +public enum LocalPkgProvider { + INSTANCE; + + private CopyOnWriteArrayList pkgs; + + private LocalPkgProvider() + { + pkgs = new CopyOnWriteArrayList (); + } + + public void clear() { + pkgs.clear(); + } + + public CopyOnWriteArrayList getPkgs() + { + return pkgs; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Package.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Package.java new file mode 100644 index 0000000..af70d66 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Package.java @@ -0,0 +1,140 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +public class Package { + public static enum INSTALLINFO + { + INSTALLED, NOT_INSTALLED, DIFFERENT_VERSION + } + + public static enum PKGTYPE + { + LOCAL, REMOTE + } + + private String name = ""; + private String arch = ""; + private String newVersion = ""; + private String installVersion = ""; + private boolean checkColumn = false; + private INSTALLINFO installInfo = INSTALLINFO.NOT_INSTALLED; + private PKGTYPE pkgType = PKGTYPE.LOCAL; + private boolean isChecked = false; + private boolean isNewlyChanged = false; + + public Package() { + + } + + public Package(String name, String installedVersion, String remoteVersion, String arch) { + this.name = name; + this.installVersion = installedVersion; + this.newVersion = remoteVersion; + this.arch = arch; + } + + public PKGTYPE getPkgType() + { + return pkgType; + } + + public void setPkgType( PKGTYPE pkgType ) + { + this.pkgType = pkgType; + } + + public void setArch(String arch) + { + this.arch = arch; + } + + public String getArch() + { + return arch; + } + + public INSTALLINFO getInstallInfo() + { + return installInfo; + } + + public void setInstallInfo( INSTALLINFO installInfo ) + { + this.installInfo = installInfo; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setInstalledVersion(String ver) { + this.installVersion = ver; + } + + public String getInstalledVersion() { + return installVersion; + } + + public void setNewVersion(String ver) { + this.newVersion = ver; + } + + public String getNewVersion() { + return newVersion; + } + + public boolean getCheckColumn() + { + return checkColumn; + } + + public void setCheckColumn( boolean check ) + { + this.checkColumn = check; + } + + public void setChecked( boolean value ) { + this.isChecked = value; + } + + public boolean isChecked() { + return this.isChecked; + } + + public void setNewlyChanged( boolean value ) { + this.isNewlyChanged = value; + } + + public boolean isNewlyChanged() { + return this.isNewlyChanged; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/PackageProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/PackageProvider.java new file mode 100644 index 0000000..a5054e1 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/PackageProvider.java @@ -0,0 +1,93 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +import java.util.concurrent.CopyOnWriteArrayList; + +public enum PackageProvider { + INSTANCE; + + private CopyOnWriteArrayList buildsystem_pkgs; + private CopyOnWriteArrayList device_pkgs; + + private PackageProvider() + { + buildsystem_pkgs = new CopyOnWriteArrayList (); + device_pkgs = new CopyOnWriteArrayList (); + } + + public void clear() { + buildsystem_pkgs.clear(); + device_pkgs.clear(); + } + + public CopyOnWriteArrayList getBuildsystemPkgs() + { + return buildsystem_pkgs; + } + + public CopyOnWriteArrayList getSelectedBuildsystemPkgs(boolean remove) + { + CopyOnWriteArrayList selectedList = new CopyOnWriteArrayList(); + for( Package pkg: buildsystem_pkgs ) { + if ( pkg.isChecked() ) { + if ( remove && !pkg.getInstalledVersion().isEmpty() ) { + selectedList.add(pkg); + } + else if ( !remove && !pkg.getNewVersion().isEmpty() ) { + selectedList.add(pkg); + } + } + } + + return selectedList; + } + + public CopyOnWriteArrayList getDevicePkgs() + { + return device_pkgs; + } + + + public CopyOnWriteArrayList getSelectedDevicePkgs(boolean remove) + { + CopyOnWriteArrayList selectedList = new CopyOnWriteArrayList(); + for( Package pkg: device_pkgs ) { + if ( pkg.isChecked() ) { + if ( remove && !pkg.getInstalledVersion().isEmpty() ) { + selectedList.add(pkg); + } + else if ( !remove && !pkg.getNewVersion().isEmpty() ) { + selectedList.add(pkg); + } + } + } + + return selectedList; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePackage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePackage.java new file mode 100644 index 0000000..ee02bd3 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePackage.java @@ -0,0 +1,58 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +public class RemotePackage extends Package { + + private String repository = ""; + private boolean checkGrayed = false; + + public RemotePackage() { + super(); + } + + public void setRepo(String repository) + { + this.repository = repository; + } + + public String getRepo() + { + return repository; + } + + public boolean getCheckGrayed() + { + return checkGrayed; + } + + public void setCheckGrayed( boolean check ) + { + this.checkGrayed = check; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePkgProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePkgProvider.java new file mode 100644 index 0000000..e244cde --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RemotePkgProvider.java @@ -0,0 +1,57 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +import java.util.concurrent.CopyOnWriteArrayList; +public enum RemotePkgProvider { + INSTANCE; + + private CopyOnWriteArrayList pkgs; + private CopyOnWriteArrayList selected_pkgs; + + private RemotePkgProvider() + { + pkgs = new CopyOnWriteArrayList (); + selected_pkgs = new CopyOnWriteArrayList (); + } + + public void clear() { + pkgs.clear(); + selected_pkgs.clear(); + } + + public CopyOnWriteArrayList getPkgs() + { + return pkgs; + } + + public CopyOnWriteArrayList getSelectedPkgs() + { + return selected_pkgs; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Repository.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Repository.java new file mode 100644 index 0000000..5a522d9 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/Repository.java @@ -0,0 +1,84 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +public class Repository { + private String name = ""; + private String uri = ""; + private boolean dirty = false; + private boolean checkColumn = false; + + public Repository() { + + } + + public Repository( String name, String uri ) { + this.name = name; + this.uri = uri; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getUri() + { + return uri; + } + + public void setUri(String uri) + { + this.uri = uri; + } + + public boolean getCheckColumn() + { + return checkColumn; + } + + public void setCheckColumn( boolean check ) + { + this.checkColumn = check; + } + + public boolean getCheckDirty() + { + return dirty; + } + + public void setCheckDirty( boolean check ) + { + this.dirty = check; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RepositoryProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RepositoryProvider.java new file mode 100644 index 0000000..1d79b4c --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/model/RepositoryProvider.java @@ -0,0 +1,60 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.model; + +import java.util.concurrent.CopyOnWriteArrayList; + +public enum RepositoryProvider { + + INSTANCE; + + private CopyOnWriteArrayList buildsystem_repos; + private CopyOnWriteArrayList device_repos; + + private RepositoryProvider() + { + buildsystem_repos = new CopyOnWriteArrayList (); + device_repos = new CopyOnWriteArrayList (); + } + + public void clear() + { + buildsystem_repos.clear(); + device_repos.clear(); + } + + public CopyOnWriteArrayList getBuildsystemRepos() + { + return buildsystem_repos; + } + + public CopyOnWriteArrayList getDeviceRepos() + { + return device_repos; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRemotePackageDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRemotePackageDialog.java new file mode 100644 index 0000000..5d91bbf --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRemotePackageDialog.java @@ -0,0 +1,303 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.util.ResourceBundle; + +import org.eclipse.swt.graphics.Color; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; + +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.pkgmgr.model.RemotePackage; +import org.tizen.nativeplatform.pkgmgr.model.RemotePkgProvider; + +public class AddRemotePackageDialog extends Dialog { + + private TableViewer packageViewer; + private int selectedColumn = 0; + private Display disp = null; + + private int x = 0; + private int y = 0; + private final int width = 800; + private final int height = 800; + + private final String BUNDLE_NAME = AddRemotePackageDialog.class.getPackage().getName() + ".PkgMgrUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + protected AddRemotePackageDialog(Shell parentShell) { + super(parentShell); + + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + this.disp = parentShell.getDisplay(); + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("AddRemotePkg.Title")); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + createTable(composite); + return null; + } + + private void createTable( Composite parent ) + { + + Composite bottom = new Composite( parent, SWT.NONE ); + bottom.setLayoutData(new GridData(GridData.FILL_BOTH)); + bottom.setLayout(new GridLayout(1, false)); + + Composite b2 = new Composite( bottom, SWT.NONE ); + b2.setLayoutData(new GridData(GridData.FILL_BOTH)); + b2.setLayout(new FillLayout()); + + packageViewer = new TableViewer( b2, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK); + createColumns(); + Table table = packageViewer.getTable(); + table.addListener( SWT.Selection, new Listener(){ + + @Override + public void handleEvent(Event event) { + if( event.detail == SWT.CHECK ) { + RemotePackage pkg = (RemotePackage)event.item.getData(); + pkg.setCheckColumn( !pkg.getCheckColumn() ); + } + } + }); + + table.setHeaderVisible(true); + table.setLinesVisible(true); + + packageViewer.setContentProvider(new ArrayContentProvider()); + packageViewer.setInput(RemotePkgProvider.INSTANCE.getPkgs()); + + updateCheck(); + } + + private void createColumns() + { + String[] titles = {"Package Name", "Repository", "Arch", "Version", "Status"}; + int[] bounds = { 250, 120, 60, 150, 160}; + + TableViewerColumn colPackage = createTableViewerColumn( titles[0], bounds[0], SWT.NONE); + + colPackage.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + return pkg.getName(); + } + }); + + TableViewerColumn colInstallType = createTableViewerColumn( titles[1], bounds[1], SWT.NONE); + + colInstallType.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + RemotePackage pkg = (RemotePackage)element; + return pkg.getRepo(); + } + }); + + TableViewerColumn colArch = createTableViewerColumn( titles[2], bounds[2], SWT.NONE); + + colArch.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + RemotePackage pkg = (RemotePackage)element; + String arch = ""; + arch = pkg.getArch(); + return arch; + } + }); + + TableViewerColumn colNewVer = createTableViewerColumn( titles[3], bounds[3], SWT.NONE); + + colNewVer.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + RemotePackage pkg = (RemotePackage)element; + String newVer = ""; + newVer = pkg.getNewVersion(); + return newVer; + } + }); + + TableViewerColumn colStatus = createTableViewerColumn( titles[4], bounds[4], SWT.NONE); + + colStatus.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + RemotePackage pkg = (RemotePackage)element; + String status = ""; + status = pkg.getInstallInfo().toString(); + return status; + } + }); + } + + private TableViewerColumn createTableViewerColumn( String title, int bound, int Style) { + + final TableViewerColumn viewerColumn = new TableViewerColumn( packageViewer, Style); + final TableColumn column = viewerColumn.getColumn(); + column.addSelectionListener(new TableSelectionAdapter()); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(true); + return viewerColumn; + } + + @Override + protected void okPressed() { + + for(RemotePackage p : RemotePkgProvider.INSTANCE.getPkgs()) { + if (p.getCheckColumn() && !Package.INSTALLINFO.INSTALLED.equals(p.getInstallInfo())) { + RemotePkgProvider.INSTANCE.getSelectedPkgs().add(p); + } + } + + super.okPressed(); + } + + private class TableSelectionAdapter extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) { + selectedColumn = packageViewer.getTable().indexOf((TableColumn) e.widget); + packageViewer.getTable().setSortColumn((TableColumn)e.widget); + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + packageViewer.getTable().setSortDirection(SWT.UP); + } else { + packageViewer.getTable().setSortDirection(SWT.DOWN); + } + + packageViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + int result = 0; + + RemotePackage entry_1 = (RemotePackage)e1; + RemotePackage entry_2 = (RemotePackage)e2; + + switch (selectedColumn) { + case 0: + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getName().compareTo(entry_2.getName()); + } else { + result = entry_2.getName().compareTo(entry_1.getName()); + } + break; + case 1: + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getRepo().compareTo(entry_2.getRepo()); + } else { + result = entry_2.getRepo().compareTo(entry_1.getRepo()); + } + break; + case 2: + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getArch().compareTo(entry_2.getArch()); + } else { + result = entry_2.getArch().compareTo(entry_1.getArch()); + } + break; + case 3: + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getNewVersion().compareTo(entry_2.getNewVersion()); + } else { + result = entry_2.getNewVersion().compareTo(entry_1.getNewVersion()); + } + break; + case 4: + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getInstallInfo().toString().compareTo(entry_2.getInstallInfo().toString()); + } else { + result = entry_2.getInstallInfo().toString().compareTo(entry_1.getInstallInfo().toString()); + } + break; + default: + break; + } + + return result; + } + }); + updateCheck(); + } + } + + private void updateCheck() { + int recentTableIndex = packageViewer.getTable().getItemCount(); + Color installedColor = disp.getSystemColor(SWT.COLOR_LIST_SELECTION); + + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = packageViewer.getTable().getItem(i); + RemotePackage pkg = (RemotePackage)item.getData(); + item.setChecked(pkg.getCheckColumn()); + if (Package.INSTALLINFO.INSTALLED.equals(pkg.getInstallInfo())) { + item.setBackground(installedColor); + } + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRepoDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRepoDialog.java new file mode 100644 index 0000000..930d5af --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/AddRepoDialog.java @@ -0,0 +1,114 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.util.ResourceBundle; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class AddRepoDialog extends Dialog { + + private Text uriText; + private String url; + + private int x = 0; + private int y = 0; + private final int width = 500; + private final int height = 120; + + private final String BUNDLE_NAME = AddRepoDialog.class.getPackage().getName() + ".PkgMgrUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + + protected AddRepoDialog(Shell parentShell) { + super(parentShell); + } + + + public AddRepoDialog(Shell parentShell, String tab) { + super(parentShell); + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + } + + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("AddRepo.Title")); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(2, false)); + + //Label nameLabel = new Label(composite, SWT.NONE); + //nameLabel.setText(resources.getString("AddRepo.Label.Name")); + //nameText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + //GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + //gridData.widthHint = 500; + //nameText.setLayoutData(gridData); + + Label urlLabel = new Label(composite, SWT.NONE); + urlLabel.setText(resources.getString("AddRepo.Label.Uri")); + uriText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 500; + uriText.setLayoutData(gridData); + + return null; + } + + + @Override + protected void okPressed() { + url = uriText.getText().trim(); + super.okPressed(); + } + + + public String getRepositoryURL() { + return url; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/BuildSystemTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/BuildSystemTab.java new file mode 100644 index 0000000..b28aed0 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/BuildSystemTab.java @@ -0,0 +1,353 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.pkgmgr.model.PackageProvider; +import org.tizen.nativeplatform.pkgmgr.model.Repository; +import org.tizen.nativeplatform.pkgmgr.model.RepositoryProvider; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; + + +public class BuildSystemTab extends CommonTab { + + private PlatformRootstrap rootstrap; + private String rootstrapPath = ""; + + + public BuildSystemTab(Shell shell, TabFolder folder, PlatformRootstrap rootstrap) { + super(shell, folder); + this.rootstrap = rootstrap; + this.rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(rootstrap.getPath().toOSString()); + } + + + protected CopyOnWriteArrayList getRepositoryList() { + return RepositoryProvider.INSTANCE.getBuildsystemRepos(); + } + + + public void updateRepositoryInfo() { + initializeRepositoryInfo(rootstrap); + } + + + public static void initializeRepositoryInfo(PlatformRootstrap rootstrap) { + String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(rootstrap.getPath().toOSString()); + RepositoryProvider.INSTANCE.getBuildsystemRepos().clear(); + RPMPackageCommander.resetRepositoryForRootstrap(rootstrapPath); + int idx = 0; + for (String url : rootstrap.getRepositoryURLs()) { + String name = String.format("url%d", idx++); + RepositoryProvider.INSTANCE.getBuildsystemRepos() + .add(new Repository(name, url )); + //TODO + RPMPackageCommander.addRepositoryForRootstrap(name, url, rootstrapPath); + } + } + + + public static void initializePackageInfo(PlatformRootstrap rootstrap, + IProgressMonitor monitor ) throws InterruptedException { + + String rootstrapPath = SmartBuildInterface.getInstance().getPlatformRootstrapPath(rootstrap.getPath().toOSString()); + PackageProvider.INSTANCE.getBuildsystemPkgs().clear(); + PackageProvider.INSTANCE.getBuildsystemPkgs() + .addAll(RPMPackageCommander.getPackageListForRootstrap(rootstrapPath, monitor)); + } + + + public void createTab() { + createCommonTab(folder, + resources.getString("PkgMgr.Tab.Buildsystem") +" [" + rootstrap.getName() +"]"); + } + + + protected void handleAddRepositoryButton(){ + AddRepoDialog dialog = new AddRepoDialog(shell, resources.getString("PkgMgr.Tab.Buildsystem")); + if ( dialog.open() != AddRepoDialog.OK ) { + return; + } + String name = String.format("url%d", repoViewer.getTable().getItemCount()); + String url = dialog.getRepositoryURL(); + RPMPackageCommander.addRepositoryForRootstrap(name, url, rootstrapPath); + + rootstrap.addRepositoryURL(url); + } + + + protected void handleModifyRepositoryButton() { + int selectedIdx = repoViewer.getTable().getSelectionIndex(); + if ( selectedIdx == -1 ) { + DialogUtil.openMessageDialog(resources.getString("PkgMgr.Message.Select.OnePackage")); + return; + } + + Repository repos = (Repository)repoViewer.getTable().getItem(selectedIdx).getData(); + ModifyRepoDialog dialog = new ModifyRepoDialog(shell, resources.getString("PkgMgr.Tab.Buildsystem"), + repos.getName(), repos.getUri(), false); + if ( dialog.open() != ModifyRepoDialog.OK ) { + return; + } + rootstrap.changeRepositoryURL(repos.getUri(), dialog.getRepositoryURL()); + } + + + protected void handleRemoveRepositoryButton() { + int selectedIdx = repoViewer.getTable().getSelectionIndex(); + if ( selectedIdx == -1 ) { + DialogUtil.openMessageDialog(resources.getString("PkgMgr.Message.Select.OnePackage")); + return; + } + Repository repos = (Repository)repoViewer.getTable().getItem(selectedIdx).getData(); + rootstrap.removeRepositoryURL(repos.getUri()); + } + + + protected void handleRefreshRepositoryButton() { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + + try { + dialog.run(true, false, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + monitor.beginTask(resources.getString("PkgMgr.Message.Refreshing"), -1); + RPMPackageCommander.refreshRepositoryForRootstrap(rootstrapPath); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.RefreshFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.RefreshFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleUpgradeRootstrapButton() { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Upgrade"), -1); + RPMPackageCommander.DistUpgradeRootstrap(rootstrapPath, monitor); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.UpgradeFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.UpgradeFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleInstallPackageButton() { + final CopyOnWriteArrayList selectedList = + PackageProvider.INSTANCE.getSelectedBuildsystemPkgs(false); + + if(selectedList.isEmpty()) { + DialogUtil.openErrorDialog( resources.getString("PkgMgr.Error.Noselected.Package")); + return; + } + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Installing.Package"), -1); + RPMPackageCommander.installRemotePkgForRootstrap(selectedList, rootstrapPath, monitor); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleInstallLocalPackageButton( final ArrayList selectedFiles ) { + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Installing.LocalPackage"), -1); + RPMPackageCommander.InstallLocalPkgToRootstrap(selectedFiles, rootstrapPath, monitor); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleRemovePackageButton() { + final CopyOnWriteArrayList selectedList = + PackageProvider.INSTANCE.getSelectedBuildsystemPkgs(true); + if(selectedList.isEmpty()) { + DialogUtil.openErrorDialog( resources.getString("PkgMgr.Error.Noselected.Package")); + return; + } + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Uninstalling.Package"), -1); + RPMPackageCommander.uninstallPkgFromRootstrap(selectedList, rootstrapPath, monitor); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.UninstallFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.UninstallFailed")+ + "("+e.toString()+")"); + } + } + + + protected CopyOnWriteArrayList getPackageList() { + return PackageProvider.INSTANCE.getBuildsystemPkgs(); + } + + + protected void updatePackageInfo(ArrayList localPackageFileList ) { + ArrayList fullList; + try { + fullList = RPMPackageCommander.getPackageListForRootstrap(rootstrapPath, null); + } catch (InterruptedException e) { + fullList = new ArrayList(); + } + ArrayList removeList = new ArrayList(); + for( Package pkg: PackageProvider.INSTANCE.getBuildsystemPkgs()) { + boolean found = false; + for( Package currPkg: fullList ) { + if ( currPkg.getName().equals(pkg.getName())) { + // check newly install + if( !pkg.getInstalledVersion().equals(currPkg.getInstalledVersion())) { + pkg.setNewlyChanged(true); + } + + pkg.setInstalledVersion(currPkg.getInstalledVersion()); + found = true; + break; + } + } + if ( !found ) { + removeList.add(pkg); + } + pkg.setChecked(false); + } + + // remove + for( Package pkg: removeList ) { + PackageProvider.INSTANCE.getBuildsystemPkgs().remove(pkg); + } + + // add if there is new package + for( Package currPkg: fullList ) { + boolean found = false; + for( Package pkg: PackageProvider.INSTANCE.getBuildsystemPkgs()) { + if ( currPkg.getName().equals(pkg.getName())) { + found = true; + break; + } + } + + if ( !found ) { + PackageProvider.INSTANCE.getBuildsystemPkgs().add(currPkg); + currPkg.setNewlyChanged(true); + } + } + + // check local package update + if ( localPackageFileList != null ) { + ArrayList localPackageNameList = new ArrayList(); + for( String filePath: localPackageFileList) { + localPackageNameList.add(RPMPackageCommander.getPkgNameForFile(filePath)); + } + for( Package pkg: PackageProvider.INSTANCE.getBuildsystemPkgs()) { + if( localPackageNameList.contains( pkg.getName() ) ) { + pkg.setNewlyChanged(true); + } + } + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/CommonTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/CommonTab.java new file mode 100644 index 0000000..818ce21 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/CommonTab.java @@ -0,0 +1,606 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.io.File; +import java.util.ArrayList; +import java.util.ResourceBundle; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ICheckStateProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +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.Text; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.pkgmgr.model.Repository; + +abstract public class CommonTab { + + protected TableViewer repoViewer = null; + protected CheckboxTableViewer pkgViewer = null; + protected Combo categoryCombo; + protected Text filterText; + + protected final Shell shell; + protected TabFolder folder = null; + protected final String BUNDLE_NAME = BuildSystemTab.class.getPackage().getName() + ".PkgMgrUIMessages";//$NON-NLS-1$ + protected final ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + + public CommonTab(Shell shell, TabFolder folder) { + this.shell = shell; + this.folder = folder; + } + + abstract protected CopyOnWriteArrayList getRepositoryList(); + abstract public void updateRepositoryInfo(); + + protected void createCommonTab( TabFolder parent, String title ) + { + TabItem buildsystemTab = new TabItem( parent, SWT.NULL ); + buildsystemTab.setText(title); + + Composite composite = new Composite(folder, SWT.NONE); + buildsystemTab.setControl(composite); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + createRepositoryGroup( composite ); + createPackageGroup( composite ); + } + + + private void createRepositoryGroup( Composite parent ) + { + Group grpRepo = new Group(parent, SWT.NONE); + grpRepo.setText(resources.getString("PkgMgr.Frame.Respository")); + GridData repo_gd = new GridData(GridData.FILL_HORIZONTAL); + repo_gd.heightHint = 110; + grpRepo.setLayoutData(repo_gd); + grpRepo.setLayout(new GridLayout(2, false)); + + createRepositoryTable( grpRepo ); + createRepositoryButtons( grpRepo ); + } + + + private void createRepositoryTable( Composite parent) + { + Composite composite = new Composite( parent, SWT.NONE ); + GridData gridData = new GridData(GridData.FILL_BOTH); + composite.setLayoutData(gridData); + composite.setLayout(new FillLayout()); + + repoViewer = new TableViewer( composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL ); + createColumnsForRepoTable( composite ); + Table reposTable = repoViewer.getTable(); + reposTable.setHeaderVisible(true); + reposTable.setLinesVisible(true); + repoViewer.setContentProvider(new ArrayContentProvider()); + repoViewer.setInput(getRepositoryList()); + } + + + private void createColumnsForRepoTable( Composite parent ) + { + String[] titles = {resources.getString("PkgMgr.Repo.Table.Column.1"), + resources.getString("PkgMgr.Repo.Table.Column.2")}; + int[] bounds = { 100, 600 }; + + TableViewerColumn colName = createTableViewerColumn( repoViewer, titles[0], bounds[0], SWT.NONE); + colName.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Repository repo = (Repository)element; + return repo.getName(); + } + }); + + TableViewerColumn colUrl = createTableViewerColumn( repoViewer, titles[1], bounds[1], SWT.NONE); + colUrl.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Repository repo = (Repository)element; + return repo.getUri(); + } + }); + } + + + private TableViewerColumn createTableViewerColumn(TableViewer viewer, String title, int bound, int Style) { + + final TableViewerColumn viewerColumn = new TableViewerColumn( viewer, Style); + final TableColumn column = viewerColumn.getColumn(); + column.addSelectionListener(new PackageTableSelectionAdapter(pkgViewer)); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(true); + return viewerColumn; + } + + + private void createRepositoryButtons( Composite parent ) + { + Composite composite = new Composite( parent, SWT.NONE ); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + RowLayout layout = new RowLayout(SWT.VERTICAL); + layout.pack = false; + composite.setLayout(layout); + + + Button add_bt = new Button( composite, SWT.PUSH ); + add_bt.setText(resources.getString("PkgMgr.Button.AddRepo")); + add_bt.setToolTipText(resources.getString("PkgMgr.Button.AddRepo.Tooltip")); + add_bt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleAddRepositoryButton(); + updateRepositoryInfo(); + repoViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + + }); + + Button modify_bt = new Button( composite, SWT.PUSH ); + modify_bt.setText(resources.getString("PkgMgr.Button.ModifyRepo")); + modify_bt.setToolTipText(resources.getString("PkgMgr.Button.ModifyRepo.Tooltip")); + modify_bt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleModifyRepositoryButton(); + updateRepositoryInfo(); + repoViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + Button remove_bt = new Button( composite, SWT.PUSH ); + remove_bt.setText(resources.getString("PkgMgr.Button.RemoveRepo")); + remove_bt.setToolTipText(resources.getString("PkgMgr.Button.RemoveRepo.Tooltip")); + remove_bt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleRemoveRepositoryButton(); + updateRepositoryInfo(); + repoViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + } + + + abstract protected void handleAddRepositoryButton(); + abstract protected void handleModifyRepositoryButton(); + abstract protected void handleRemoveRepositoryButton(); + + + protected void createPackageGroup( Composite parent ) + { + Group grpPkg = new Group(parent, SWT.NONE); + grpPkg.setText(resources.getString("PkgMgr.Frame.Package")); + GridData pkgs_gd = new GridData(GridData.FILL_BOTH|GridData.GRAB_VERTICAL); + grpPkg.setLayoutData(pkgs_gd); + grpPkg.setLayout(new GridLayout(1, false)); + + createPackageButtonsAndFilter( grpPkg ); + createPackageTable( grpPkg ); + } + + + protected void createPackageButtonsAndFilter( Composite parent ) { + Composite composite = new Composite( parent, SWT.NONE ); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + composite.setLayout(new GridLayout(2, false)); + + createPackageButtons( composite ); + createPackageFilter( composite ); + } + + + protected void createPackageButtons( Composite parent ) + { + Composite composite = new Composite( parent, SWT.NONE ); + RowLayout layout = new RowLayout(SWT.HORIZONTAL); + layout.pack = false; + composite.setLayout(layout); + + Button refresh_bt = new Button( composite, SWT.PUSH ); + refresh_bt.setText(resources.getString("PkgMgr.Button.RefreshRepo")); + refresh_bt.setToolTipText(resources.getString("PkgMgr.Button.RefreshRepo.Tooltip")); + refresh_bt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleRefreshRepositoryButton(); + updatePackageInfo(null); + pkgViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + + Button upgrade_bt = new Button( composite, SWT.PUSH ); + upgrade_bt.setText(resources.getString("PkgMgr.Button.Upgrade")); + upgrade_bt.setToolTipText(resources.getString("PkgMgr.Button.Upgrade.Tooltip")); + upgrade_bt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleUpgradeRootstrapButton(); + updatePackageInfo(null); + pkgViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + Button install_bt = new Button( composite, SWT.PUSH ); + install_bt.setText(resources.getString("PkgMgr.Button.Install")); + install_bt.setToolTipText(resources.getString("PkgMgr.Button.Install.Tooltip")); + install_bt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleInstallPackageButton(); + updatePackageInfo(null); + pkgViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + + }); + + Button installLocal_bt = new Button( composite, SWT.PUSH ); + installLocal_bt.setText(resources.getString("PkgMgr.Button.InstallLocal")); + installLocal_bt.setToolTipText(resources.getString("PkgMgr.Button.InstallLocal.Tooltip")); + installLocal_bt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + FileDialog fd = new FileDialog( shell, SWT.OPEN|SWT.MULTI); + fd.setText(resources.getString("FileDlg.Title")); + String[] filterExt = { resources.getString("FileDlg.Filter.Ext") }; + fd.setFilterExtensions(filterExt); + String firstFilePath = fd.open(); + if ( firstFilePath == null ) { return; } + + String[] fileNames = fd.getFileNames(); + final ArrayList selectedFiles = new ArrayList(); + for( String fileName : fileNames ) { + selectedFiles.add(new File(firstFilePath).getParent()+"/"+fileName); + } + + handleInstallLocalPackageButton(selectedFiles); + updatePackageInfo(selectedFiles); + pkgViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + Button removeBt = new Button( composite, SWT.PUSH ); + removeBt.setText(resources.getString("PkgMgr.Button.Uninstall")); + removeBt.setToolTipText(resources.getString("PkgMgr.Button.Uninstall.Tooltip")); + removeBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + handleRemovePackageButton(); + updatePackageInfo(null); + pkgViewer.refresh(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + } + + + abstract protected void handleRefreshRepositoryButton(); + abstract protected void handleUpgradeRootstrapButton(); + abstract protected void handleInstallPackageButton(); + abstract protected void handleInstallLocalPackageButton(final ArrayList selectedFiles); + abstract protected void handleRemovePackageButton(); + + abstract protected CopyOnWriteArrayList getPackageList(); + abstract protected void updatePackageInfo(ArrayList localPackageFileList); + + + private void createPackageFilter( Composite parent ) { + Composite composite = new Composite( parent, SWT.NONE ); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL|GridData.GRAB_HORIZONTAL)); + composite.setLayout(new GridLayout(3,false)); + + Label filterTextLabel = new Label(composite, SWT.NONE); + filterTextLabel.setText(resources.getString("PkgMgr.Label.Filter")); + + categoryCombo = new Combo(composite, SWT.READ_ONLY); + String[] items = {"All","Installed","Upgradable"}; + categoryCombo.setItems(items); + categoryCombo.addSelectionListener( new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + pkgViewer.refresh(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // do nothing + } + }); + categoryCombo.select(0); + + + filterText = new Text( composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + filterText.setLayoutData(gridData); + filterText.addModifyListener(new ModifyListener() { + + @Override + public void modifyText(ModifyEvent e) { + pkgViewer.refresh(); + } + }); + } + + + + private void createPackageTable( Composite parent ) + { + Composite composite = new Composite( parent, SWT.NONE ); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new FillLayout()); + + pkgViewer = CheckboxTableViewer.newCheckList( composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK ); + createPackageTableColumns( composite ); + Table packageTable = pkgViewer.getTable(); + packageTable.addListener( SWT.Selection, new Listener(){ + + @Override + public void handleEvent(Event event) { + if( event.detail == SWT.CHECK ) + { + Package pkg = (Package)event.item.getData(); + pkg.setCheckColumn( !pkg.getCheckColumn() ); + } + } + }); + + packageTable.setHeaderVisible(true); + packageTable.setLinesVisible(true); + + pkgViewer.setContentProvider(new ArrayContentProvider()); + pkgViewer.setCheckStateProvider(new ICheckStateProvider() { + + @Override + public boolean isChecked(Object element) { + Package pkg = (Package) element; + return pkg.isChecked(); + } + + @Override + public boolean isGrayed(Object element) { + return false; + } + }); + pkgViewer.addFilter( new ViewerFilter() { + + @Override + public boolean select(Viewer viewer, Object parentElement, + Object element) { + Package pkg = (Package) element; + if ( categoryCombo != null ) { + if ( categoryCombo.getText().equals("Installed") && + pkg.getInstalledVersion().isEmpty() ) { + return false; + } + if ( categoryCombo.getText().equals("Upgradable") && + ( pkg.getInstalledVersion().isEmpty() || + pkg.getNewVersion().isEmpty() || + RPMPackageCommander.compareVersion(pkg.getInstalledVersion(),pkg.getNewVersion()) >= 0 )) { + return false; + } + } + if ( filterText != null && !pkg.getName().contains(filterText.getText()) ) { + return false; + } + return true; + } + + }); + pkgViewer.addCheckStateListener( new ICheckStateListener() { + + @Override + public void checkStateChanged(CheckStateChangedEvent event) { + Package pkg = (Package)event.getElement(); + pkg.setChecked(true); + } + }); + pkgViewer.setInput(getPackageList()); + } + + + private void createPackageTableColumns( Composite parent ) + { + String[] titles = {"S", "Package Name", "Installed Version", "New Version", "Arch", "Description"}; + int[] bounds = { 24, 200, 150, 150, 60, 150}; + + TableViewerColumn colSelection = createTableViewerColumn( pkgViewer, titles[0], bounds[0], SWT.NONE); + colSelection.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + return ""; + } + }); + + TableViewerColumn colPackage = createTableViewerColumn( pkgViewer, titles[1], bounds[1], SWT.NONE); + colPackage.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + if ( pkg.isNewlyChanged() ) { + return "*"+pkg.getName(); + } + else { + return pkg.getName(); + } + } + }); + + TableViewerColumn colInsVer = createTableViewerColumn( pkgViewer, titles[2], bounds[2], SWT.NONE); + colInsVer.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String installedVer = pkg.getInstalledVersion(); + return installedVer; + } + }); + + + TableViewerColumn colNewVer = createTableViewerColumn( pkgViewer, titles[3], bounds[3], SWT.NONE); + + colNewVer.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String newVer = pkg.getNewVersion(); + return newVer; + } + }); + + TableViewerColumn colArch = createTableViewerColumn( pkgViewer, titles[4], bounds[4], SWT.NONE); + + colArch.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + String arch = pkg.getArch(); + return arch; + } + }); + + TableViewerColumn colDescription = createTableViewerColumn( pkgViewer, titles[5], bounds[5], SWT.NONE); + colDescription.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + return ""; + } + }); + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/DeviceTab.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/DeviceTab.java new file mode 100644 index 0000000..9c61488 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/DeviceTab.java @@ -0,0 +1,319 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.pkgmgr.model.PackageProvider; +import org.tizen.nativeplatform.pkgmgr.model.Repository; +import org.tizen.nativeplatform.pkgmgr.model.RepositoryProvider; +import org.tizen.sdblib.IDevice; + + +public class DeviceTab extends CommonTab{ + + private final IDevice device; + + public DeviceTab(Shell shell, TabFolder folder, IDevice dev) { + super(shell, folder); + this.device = dev; + } + + + protected CopyOnWriteArrayList getRepositoryList() { + return RepositoryProvider.INSTANCE.getDeviceRepos(); + } + + + public void updateRepositoryInfo() { + initializeRepositoryInfo(device); + } + + + public static void initializeRepositoryInfo(IDevice device) { + RepositoryProvider.INSTANCE.getDeviceRepos().clear(); + Hashtable reposHash = RPMPackageCommander.getRepositoryListForDevice(device); + Enumeration e = reposHash.keys(); + while(e.hasMoreElements()) { + String name = e.nextElement(); + String url = reposHash.get(name); + RepositoryProvider.INSTANCE.getDeviceRepos() + .add(new Repository(name, url )); + } + } + + + public static void initializePackageInfo(IDevice device) { + + PackageProvider.INSTANCE.getDevicePkgs().clear(); + PackageProvider.INSTANCE.getDevicePkgs() + .addAll(RPMPackageCommander.getPackageListForDevice(device)); + } + + + public void createTab() { + createCommonTab(folder, + resources.getString("PkgMgr.Tab.Device")+" ["+device.getSerialNumber()+"]"); + } + + + protected void handleAddRepositoryButton(){ + ModifyRepoDialog dialog = new ModifyRepoDialog(shell, resources.getString("PkgMgr.Tab.Device")); + if ( dialog.open() != ModifyRepoDialog.OK ) { + return; + } + String name = dialog.getRepositoryName(); + String url = dialog.getRepositoryURL(); + RPMPackageCommander.addRepositoryForDevice(name, url, device); + } + + + protected void handleModifyRepositoryButton() { + int selectedIdx = repoViewer.getTable().getSelectionIndex(); + if ( selectedIdx == -1 ) { + DialogUtil.openMessageDialog(resources.getString("PkgMgr.Message.Select.OnePackage")); + return; + } + + Repository repos = (Repository)repoViewer.getTable().getItem(selectedIdx).getData(); + ModifyRepoDialog dialog = new ModifyRepoDialog(shell, resources.getString("PkgMgr.Tab.Device"), + repos.getName(), repos.getUri(), true); + if ( dialog.open() != ModifyRepoDialog.OK ) { + return; + } + RPMPackageCommander.removeRepositoryForDevice(repos.getName(), device); + RPMPackageCommander.addRepositoryForDevice(dialog.getRepositoryName(), dialog.getRepositoryURL(), device); + } + + + protected void handleRemoveRepositoryButton() { + int selectedIdx = repoViewer.getTable().getSelectionIndex(); + if ( selectedIdx == -1 ) { + DialogUtil.openMessageDialog(resources.getString("PkgMgr.Message.Select.OnePackage")); + return; + } + Repository repos = (Repository)repoViewer.getTable().getItem(selectedIdx).getData(); + RPMPackageCommander.removeRepositoryForDevice(repos.getName(), device); + } + + + protected void handleRefreshRepositoryButton() { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + + try { + dialog.run(true, false, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + monitor.beginTask(resources.getString("PkgMgr.Message.Refreshing"), -1); + RPMPackageCommander.refreshRepositoryForDevice(device); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.RefreshFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.RefreshFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleUpgradeRootstrapButton() { + } + + + protected void handleInstallPackageButton() { + final CopyOnWriteArrayList selectedList = + PackageProvider.INSTANCE.getSelectedDevicePkgs(false); + + if(selectedList.isEmpty()) { + DialogUtil.openErrorDialog( resources.getString("PkgMgr.Error.Noselected.Package")); + return; + } + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, false, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Installing.Package"), -1); + RPMPackageCommander.installRemotePkgForDevice(selectedList, device); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleInstallLocalPackageButton( final ArrayList selectedFiles ) { + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, false, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Installing.LocalPackage"), -1); + RPMPackageCommander.InstallLocalPkgToDevice(selectedFiles, device); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.InstallFailed")+ + "("+e.toString()+")"); + } + } + + + protected void handleRemovePackageButton() { + final CopyOnWriteArrayList selectedList = + PackageProvider.INSTANCE.getSelectedDevicePkgs(true); + if(selectedList.isEmpty()) { + DialogUtil.openErrorDialog( resources.getString("PkgMgr.Error.Noselected.Package")); + return; + } + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, false, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("PkgMgr.Message.Uninstalling.Package"), -1); + RPMPackageCommander.uninstallPkgFromDevice(selectedList, device); + monitor.done(); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.UninstallFailed")+ + "("+e.toString()+")"); + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + resources.getString("PkgMgr.Msg.Error.UninstallFailed")+ + "("+e.toString()+")"); + } + } + + + protected CopyOnWriteArrayList getPackageList() { + return PackageProvider.INSTANCE.getDevicePkgs(); + } + + + protected void updatePackageInfo(ArrayList localPackageFileList ) { + ArrayList fullList = RPMPackageCommander.getPackageListForDevice(device); + ArrayList removeList = new ArrayList(); + for( Package pkg: PackageProvider.INSTANCE.getDevicePkgs()) { + boolean found = false; + for( Package currPkg: fullList ) { + if ( currPkg.getName().equals(pkg.getName())) { + // check newly install + if( !pkg.getInstalledVersion().equals(currPkg.getInstalledVersion())) { + pkg.setNewlyChanged(true); + } + + pkg.setInstalledVersion(currPkg.getInstalledVersion()); + found = true; + break; + } + } + if ( !found ) { + removeList.add(pkg); + } + pkg.setChecked(false); + } + + // remove + for( Package pkg: removeList ) { + PackageProvider.INSTANCE.getDevicePkgs().remove(pkg); + } + + // add if there is new package + for( Package currPkg: fullList ) { + boolean found = false; + for( Package pkg: PackageProvider.INSTANCE.getDevicePkgs()) { + if ( currPkg.getName().equals(pkg.getName())) { + found = true; + break; + } + } + + if ( !found ) { + PackageProvider.INSTANCE.getDevicePkgs().add(currPkg); + currPkg.setNewlyChanged(true); + } + } + + // check local package update + if ( localPackageFileList != null ) { + ArrayList localPackageNameList = new ArrayList(); + for( String filePath: localPackageFileList) { + localPackageNameList.add(RPMPackageCommander.getPkgNameForFile(filePath)); + } + for( Package pkg: PackageProvider.INSTANCE.getDevicePkgs()) { + if( localPackageNameList.contains( pkg.getName() ) ) { + pkg.setNewlyChanged(true); + } + } + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/ModifyRepoDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/ModifyRepoDialog.java new file mode 100644 index 0000000..a6c22d2 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/ModifyRepoDialog.java @@ -0,0 +1,145 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.util.ResourceBundle; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + + +public class ModifyRepoDialog extends Dialog { + + private String name=""; + private Text nameText; + private String value=""; + private Text uriText; + private boolean canEditName = true; + + private int x = 0; + private int y = 0; + private final int width = 500; + private final int height = 170; + + private final String BUNDLE_NAME = ModifyRepoDialog.class.getPackage().getName() + ".PkgMgrUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + protected ModifyRepoDialog(Shell parentShell) { + super(parentShell); + } + + public ModifyRepoDialog(Shell parentShell, String tab) { + super(parentShell); + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + } + + + public ModifyRepoDialog(Shell parentShell, String tab, String name, String value, boolean canEditName) { + super(parentShell); + this.name = name; + this.value = value; + this.canEditName = canEditName; + + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + } + + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("ModifyRepo.Title")); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(2, false)); + + Label nameLabel = new Label(composite, SWT.NONE); + nameLabel.setText(resources.getString("ModifyRepo.Label.Name")); + if ( canEditName ) { + nameText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + } + else { + nameText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.READ_ONLY); + } + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); + gridData.widthHint = 100; + nameText.setLayoutData(gridData); + nameText.setText(name); + + Label urlLabel = new Label(composite, SWT.NONE); + urlLabel.setText(resources.getString("ModifyRepo.Label.Uri")); + uriText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 500; + uriText.setLayoutData(gridData); + uriText.setText(value); + + return null; + } + + + @Override + protected void okPressed() { + name = nameText.getText().trim(); + if ( name.isEmpty() ) + return; + + value = uriText.getText().trim(); + super.okPressed(); + } + + + public String getRepositoryName() { + return name; + } + + + public String getRepositoryURL() { + return value; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PackageTableSelectionAdapter.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PackageTableSelectionAdapter.java new file mode 100644 index 0000000..a024486 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PackageTableSelectionAdapter.java @@ -0,0 +1,127 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; + +import org.tizen.nativeplatform.pkgmgr.model.Package; + +public class PackageTableSelectionAdapter extends SelectionAdapter { + private TableViewer repoViewer; + private int selectedColumn = 0; + public PackageTableSelectionAdapter(TableViewer v) { + super(); + this.repoViewer = v; + } + + public void widgetSelected(SelectionEvent e) { + selectedColumn = repoViewer.getTable().indexOf((TableColumn) e.widget); + repoViewer.getTable().setSortColumn((TableColumn)e.widget); + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + repoViewer.getTable().setSortDirection(SWT.UP); + } else { + repoViewer.getTable().setSortDirection(SWT.DOWN); + } + + repoViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + int result = 0; + + Package entry_1 = (Package)e1; + Package entry_2 = (Package)e2; + + switch (selectedColumn) { + case 0: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getPkgType().compareTo(entry_2.getPkgType()); + } else { + result = entry_2.getPkgType().compareTo(entry_1.getPkgType()); + } + break; + case 1: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getName().compareTo(entry_2.getName()); + } else { + result = entry_2.getName().compareTo(entry_1.getName()); + } + break; + case 2: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getArch().compareTo(entry_2.getArch()); + } else { + result = entry_2.getArch().compareTo(entry_1.getArch()); + } + break; + case 3: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getNewVersion().compareTo(entry_2.getNewVersion()); + } else { + result = entry_2.getNewVersion().compareTo(entry_1.getNewVersion()); + } + break; + case 4: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getInstalledVersion().compareTo(entry_2.getInstalledVersion()); + } else { + result = entry_2.getInstalledVersion().compareTo(entry_1.getInstalledVersion()); + } + break; + case 5: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getInstallInfo().toString().compareTo(entry_2.getInstallInfo().toString()); + } else { + result = entry_2.getInstallInfo().toString().compareTo(entry_1.getInstallInfo().toString()); + } + break; + default: + break; + } + + return result; + } + }); + updateCheck(); + } + + private void updateCheck() { + int recentTableIndex = repoViewer.getTable().getItemCount(); + + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = repoViewer.getTable().getItem(i); + Package pkg = (Package)item.getData(); + item.setChecked(pkg.getCheckColumn()); + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PkgMgrUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PkgMgrUIMessages.properties new file mode 100644 index 0000000..78edb69 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/PkgMgrUIMessages.properties @@ -0,0 +1,81 @@ +PkgMgr.Title = Package Manager +PkgMgr.Frame.Description = Manage packages on rootstrap or target. +PkgMgr.Frame.Respository = Repositories +PkgMgr.Frame.Package = Packages +PkgMgr.Tab.Buildsystem = Rootstrap +PkgMgr.Tab.Device = Device +PkgMgr.Console.Name = Package Manager +PkgMgr.Error.Noselected = - No project is selected, no device is connected, or the selected project is not a Tizen project +PkgMgr.Error.Noselected.Package = No package selected. +PkgMgr.Error.Failtransfer.File = Moving the file from %s to %s failed. +PkgMgr.Warn.Notset.Proxy = (Warning: HTTP Proxy is not set. (Preferences -> Tizen SDK -> Platform -> HTTP Proxy) +PkgMgr.Info.set.Proxy = (HTTP proxy : %s) +PkgMgr.Label.Configuration = Selected configuration: +PkgMgr.Label.Connection = Selected connection: +PkgMgr.Button.AddRepo = Add +PkgMgr.Button.AddRepo.Tooltip = Add a repository +PkgMgr.Button.ModifyRepo = Modify +PkgMgr.Button.ModifyRepo.Tooltip = Modify a repository +PkgMgr.Button.RemoveRepo = Remove +PkgMgr.Button.RemoveRepo.Tooltip = Remove the selected repositories +PkgMgr.Button.RefreshRepo = Refresh +PkgMgr.Button.RefreshRepo.Tooltip = Refresh remote package information +PkgMgr.Button.Upgrade = Upgrade +PkgMgr.Button.Upgrade.Tooltip = Perform a distribution upgrade +PkgMgr.Button.Install = Install +PkgMgr.Button.Install.Tooltip = Install remote packages +PkgMgr.Button.InstallLocal = Install Local +PkgMgr.Button.InstallLocal.Tooltip = Install local packages +PkgMgr.Button.Uninstall = Uninstall +PkgMgr.Button.Uninstall.Tooltip = Uninstall packages + +PkgMgr.Label.Category = Category: +PkgMgr.Label.Filter = Filter: + +PkgMgr.Button.AddRPackage = Add Remote Package +PkgMgr.Button.AddRPackage.Tooltip = Add remote packages from repositories +PkgMgr.Button.AddLPackage = Add Local Package +PkgMgr.Button.AddLPackage.Tooltip = Add local packages from file system +PkgMgr.Button.RemoveList = Remove List +PkgMgr.Button.RemoveList.Tooltip = Remove selected packages from list +PkgMgr.Message.Refreshing = Refreshing the repository... +PkgMgr.Msg.Error.RefreshFailed = Refreshing repository failed! +PkgMgr.Message.Adding.Package = Adding selected packages to the table... +PkgMgr.Message.Getting.RemotePackage = Getting the remote package list... +PkgMgr.Message.Select.OnePackage = Please select one repository +PkgMgr.Message.Transfer.File = Transferring %s to target's %s... +PkgMgr.Message.Upgrade = Upgrading... +PkgMgr.Msg.Error.UpgradeFailed = Upgrading failed! +PkgMgr.Message.Installing.Package = Installing packages... +PkgMgr.Message.Installing.LocalPackage = Installing local packages... +PkgMgr.Msg.Error.InstallFailed = Installing failed! +PkgMgr.Message.Uninstalling.Package = Uninstalling packages... +PkgMgr.Msg.Error.UninstallFailed = Uninstalling failed! +PkgMgr.Console.Remote.Install = ***** Installing a remote package *****\n +PkgMgr.Console.Local.Install = \n***** Installing a local package *****\n +PkgMgr.Repo.Table.Column.1 = Name +PkgMgr.Repo.Table.Column.2 = Repository URL + +AddRepo.Title = Add Package Repository +AddRepo.Label.Name = Name: +AddRepo.Label.Uri = URI: +AddRepo.Message.AlreadyExist = The repository already exists + +ModifyRepo.Title = Modify Package Repository +ModifyRepo.Label.Name = Name: +ModifyRepo.Label.Uri = URI: + +AddRemotePkg.Title = Add Remote Packages + +FileDlg.Title = Select RPM files... +FileDlg.Filter.Ext = *.rpm +FileDlg.Default.Path = /home/abuild/rpmbuild/RPMS/ + +UninstallPkg.Title = Uninstall Packages +UninstallPkg.Label.Nodeps.Op = --nodeps (don't verify package dependencies) +UninstallPkg.Message.Uninstalling.Package = Uninstalling packages...\n +UninstallPkg.Message.Refreshing.Table = Refreshing tables...\n +UninstallPkg.Uninstall.Failed.Title = Failed to uninstall +UninstallPkg.Uninstall.Success.Title = Uninstalled successfully +UninstallPkg.Button.Uninstall = Uninstall +UninstallPkg.Button.DeselectAll = Deselect All \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RPMPackageDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RPMPackageDialog.java new file mode 100644 index 0000000..12c6be0 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RPMPackageDialog.java @@ -0,0 +1,244 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.io.IOException; +import java.util.ResourceBundle; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Platform; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; + +import org.osgi.framework.Bundle; +import org.tizen.common.connection.ConnectionPlugin; +import org.tizen.nativeplatform.Activator; +import org.tizen.sdblib.IDevice; +import org.tizen.nativeplatform.pkgmgr.RPMPackageCommander; +import org.tizen.nativeplatform.pkgmgr.model.LocalPkgProvider; +import org.tizen.nativeplatform.pkgmgr.model.PackageProvider; +import org.tizen.nativeplatform.pkgmgr.model.RemotePkgProvider; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; + +public class RPMPackageDialog extends Dialog { + + private IDevice device; + private TabFolder tabFolder; + + private boolean enableRootstrapTab = false; + private boolean enableTargetTab = false; + private int tabIndex = 0; + private String http_proxy = ""; + + private PlatformRootstrap rootstrap; + + private int x = 0; + private int y = 0; + private final int width = 900; + private final int height = 700; + + private final String BUNDLE_NAME = RPMPackageDialog.class.getPackage().getName() + ".PkgMgrUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + + public RPMPackageDialog(Shell parentShell, PlatformRootstrap rootstrap) { + super(parentShell); + //setBlockOnOpen(false); + this.rootstrap = rootstrap; + this.enableRootstrapTab = true; + this.device = ConnectionPlugin.getDefault().getCurrentDevice(); + this.enableTargetTab = this.device == null ? false : true; + + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + + http_proxy = PreferencesManager.getHttpProxyURL(); + RPMPackageCommander.setHttpProxy(PreferencesManager.getHttpProxyURL()); + } + + + public RPMPackageDialog(Shell parentShell, String target, boolean enableRootstrap, boolean enableTarget) { + super(parentShell); + //setBlockOnOpen(false); + this.enableRootstrapTab = enableRootstrap; + this.enableTargetTab = enableTarget; + + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + + if (enableRootstrap) { + http_proxy = PreferencesManager.getHttpProxyURL(); + RPMPackageCommander.setHttpProxy(http_proxy); + } + if (enableTarget) { + device = ConnectionPlugin.getDefault().getCurrentDevice(); + } + } + + + private void setImage(Shell parentShell) { + Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); + try { + parentShell.setImage(new Image(Display.getCurrent(), FileLocator.toFileURL(bundle.getEntry("icons/package_installer.gif")).getPath())); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + protected void setShellStyle(int newShellStyle) { + int newStyle = newShellStyle;// & ~SWT.APPLICATION_MODAL; + //newStyle |= SWT.MODELESS; + super.setShellStyle(newStyle); + } + + + @Override + public boolean close() + { + RemotePkgProvider.INSTANCE.clear(); + LocalPkgProvider.INSTANCE.clear(); + PackageProvider.INSTANCE.clear(); + return super.close(); + } + + protected void createButtonsForButtonBar(Composite parent) + { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); + } + + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(resources.getString("PkgMgr.Title")); + + if (!enableRootstrapTab && !enableTargetTab) { + newShell.setLocation(x, y); + newShell.setSize(width/2, height/4); + setImage(newShell); + } else { + newShell.setLocation(x, y); + newShell.setSize(width, height); + setImage(newShell); + } + } + + + @Override + protected Control createDialogArea(Composite parent) { + + Composite container = new Composite( parent, SWT.None ); + container.setLayoutData(new GridData(GridData.FILL_BOTH)); + container.setLayout(new GridLayout(1, false)); + + if (!enableRootstrapTab && !enableTargetTab) { + createError( container, resources.getString("PkgMgr.Error.Noselected")); + } else { + createDialogDescription ( container ); + createTabs ( container ); + } + return null; + } + + + private void createError( Composite parent, String message ) + { + Composite com = new Composite( parent, SWT.NONE ); + com.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + com.setLayout(new GridLayout(1, false)); + + Label errorLabel = new Label(com, SWT.NONE); + errorLabel.setText(message); + } + + + private void createDialogDescription(Composite composite) + { + Composite comp_descrip = new Composite(composite, SWT.NONE); + Color whiteColor = new Color(composite.getDisplay(), 255, 255, 255); + + comp_descrip.setLayout(new GridLayout(1, false)); + GridData comp_descrip_gd = new GridData(GridData.FILL_HORIZONTAL); + comp_descrip_gd.heightHint = 30; + comp_descrip.setLayoutData(comp_descrip_gd); + comp_descrip.setBackground(whiteColor); + + Label label = new Label(comp_descrip, SWT.NONE); + label.setText(resources.getString("PkgMgr.Frame.Description")); + label.setBackground(whiteColor); + } + + + private void createTabs( Composite parent ) + { + tabFolder = new TabFolder( parent, SWT.BORDER ); + tabFolder.setLayoutData(new GridData( GridData.FILL_BOTH)); + tabFolder.setLayout(new GridLayout(1, false)); + + if (enableRootstrapTab) { + BuildSystemTab tab = new BuildSystemTab(getShell(), tabFolder, rootstrap); + tab.createTab(); + } + if (enableTargetTab) { + DeviceTab tab = new DeviceTab(getShell(), tabFolder, device); + tab.createTab(); + } + + tabFolder.setSelection(tabIndex); + } + + + public void initializeDialogData(IProgressMonitor monitor) throws InterruptedException { + // init data for buildSystem Tab + BuildSystemTab.initializeRepositoryInfo(rootstrap); + BuildSystemTab.initializePackageInfo(rootstrap, monitor); + + // init data for device Tab if connected + if ( device != null ) { + DeviceTab.initializeRepositoryInfo(device); + DeviceTab.initializePackageInfo(device); + } + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RemoveInstalledPackageDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RemoveInstalledPackageDialog.java new file mode 100644 index 0000000..fa7398d --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RemoveInstalledPackageDialog.java @@ -0,0 +1,455 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import java.lang.reflect.InvocationTargetException; +import java.util.ResourceBundle; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.swt.graphics.Color; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Rectangle; +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.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativeplatform.pkgmgr.model.InstalledPackage; +import org.tizen.nativeplatform.pkgmgr.model.InstalledPkgProvider; +import org.tizen.nativeplatform.pkgmgr.model.Package; +import org.tizen.nativeplatform.pkgmgr.model.RemotePackage; +import org.tizen.nativeplatform.pkgmgr.model.RemotePkgProvider; + +public class RemoveInstalledPackageDialog extends Dialog { + + private TableViewer packageViewer; + private TableViewer selectedPackageViewer; + private Button checkNoDeps_bt; + private int selectedColumn = 0; + private Display disp = null; + + private int x = 0; + private int y = 0; + private final int width = 800; + private final int height = 800; + + private final String BUNDLE_NAME = RemoveInstalledPackageDialog.class.getPackage().getName() + ".PkgMgrUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + + protected RemoveInstalledPackageDialog(Shell parentShell, String path) { + super(parentShell); + + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + this.disp = parentShell.getDisplay(); + //this.targetId = targetId; + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("UninstallPkg.Title")); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(2, false)); + + createTable(composite); + createSelectedTable(composite); + return null; + } + + private void createTable( Composite parent ) + { + + Composite bottom = new Composite( parent, SWT.NONE ); + bottom.setLayoutData(new GridData(GridData.FILL_BOTH)); + bottom.setLayout(new GridLayout(1, false)); + + Composite b2 = new Composite( bottom, SWT.NONE ); + b2.setLayoutData(new GridData(GridData.FILL_BOTH)); + b2.setLayout(new FillLayout()); + + packageViewer = new TableViewer( b2, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK); + createColumns(); + Table table = packageViewer.getTable(); + table.addListener( SWT.Selection, new Listener(){ + + @Override + public void handleEvent(Event event) { + if( event.detail == SWT.CHECK ) { + InstalledPackage pkg = (InstalledPackage)event.item.getData(); + boolean checked = pkg.getCheckColumn(); + pkg.setCheckColumn( !checked); + if (!checked) { + InstalledPkgProvider.INSTANCE.getSelectedPkgs().add(pkg); + } else { + InstalledPkgProvider.INSTANCE.getSelectedPkgs().remove(pkg); + } + + selectedPackageViewer.refresh(); + } + } + }); + + table.setHeaderVisible(true); + table.setLinesVisible(true); + + packageViewer.setContentProvider(new ArrayContentProvider()); + packageViewer.setInput(InstalledPkgProvider.INSTANCE.getPkgs()); + + updateCheck(); + } + + private void createSelectedTable( Composite parent ) + { + + Composite bottom = new Composite( parent, SWT.NONE ); + bottom.setLayoutData(new GridData(GridData.FILL_BOTH)); + bottom.setLayout(new GridLayout(1, false)); + + Composite b2 = new Composite( bottom, SWT.NONE ); + b2.setLayoutData(new GridData(GridData.FILL_BOTH)); + b2.setLayout(new FillLayout()); + + selectedPackageViewer = new TableViewer( b2, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + createSelectedColumns(); + Table table = selectedPackageViewer.getTable(); + table.addListener( SWT.Selection, new Listener(){ + + @Override + public void handleEvent(Event event) { + } + }); + + table.setHeaderVisible(true); + table.setLinesVisible(true); + + selectedPackageViewer.setContentProvider(new ArrayContentProvider()); + selectedPackageViewer.setInput(InstalledPkgProvider.INSTANCE.getSelectedPkgs()); + + createOptionComposite(bottom); + createButtonsComposite(bottom); + } + + private void createOptionComposite(Composite parent) { + checkNoDeps_bt = new Button(parent, SWT.CHECK); + checkNoDeps_bt.setText(resources.getString("UninstallPkg.Label.Nodeps.Op")); + } + + private void createButtonsComposite(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE ); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END)); + composite.setLayout(new GridLayout(2, false)); + + Button deselect_bt = new Button(composite, SWT.PUSH); + deselect_bt.setText(resources.getString("UninstallPkg.Button.DeselectAll")); + + deselect_bt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + for(InstalledPackage p : InstalledPkgProvider.INSTANCE.getSelectedPkgs()) { + p.setCheckColumn(false); + } + + InstalledPkgProvider.INSTANCE.getSelectedPkgs().clear(); + updateCheck(); + refreshTable(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + + }); + + Button uninstall_bt = new Button(composite, SWT.PUSH); + uninstall_bt.setText(resources.getString("UninstallPkg.Button.Uninstall")); + + uninstall_bt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + final CopyOnWriteArrayList pkgList = InstalledPkgProvider.INSTANCE.getSelectedPkgs(); + if (pkgList.isEmpty()) { + DialogUtil.openErrorDialog(resources.getString("PkgMgr.Error.Noselected.Package")); + return; + } + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell()); + + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + String list = ""; + for( Package pkg: pkgList) { + list = list.concat(pkg.getName() + " "); + } + + + monitor.beginTask(resources.getString("UninstallPkg.Message.Uninstalling.Package") + + " " + list, -1); + + //RPMPackageCommander.uninstallPkgFromRootstrap(list, rootstrapPath); + + DialogUtil.openMessageDialog(getShell(), + resources.getString("UninstallPkg.Uninstall.Success.Title"), + list.replaceAll(" ", "\n")); + monitor.beginTask(resources.getString("UninstallPkg.Message.Refreshing.Table"), -1); + afterUninstallPkgs(pkgList); + } + }); + } catch (InvocationTargetException e1) { + e1.printStackTrace(); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + + refreshTable(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + } + + private void createColumns() + { + String[] titles = {"Installed Package Name"}; + int[] bounds = { 250 }; + + TableViewerColumn colPackage = createTableViewerColumn( titles[0], bounds[0], SWT.NONE); + + colPackage.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + return pkg.getName(); + } + }); + } + + private TableViewerColumn createTableViewerColumn( String title, int bound, int Style) { + + final TableViewerColumn viewerColumn = new TableViewerColumn( packageViewer, Style); + final TableColumn column = viewerColumn.getColumn(); + column.addSelectionListener(new TableSelectionAdapter()); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(true); + return viewerColumn; + } + + private void createSelectedColumns() + { + String[] titles = {"Selected Package Name"}; + int[] bounds = { 250 }; + + TableViewerColumn colPackage = createSelectedTableViewerColumn( titles[0], bounds[0], SWT.NONE); + + colPackage.setLabelProvider(new ColumnLabelProvider() { + @Override + public String getText(Object element) { + Package pkg = (Package)element; + return pkg.getName(); + } + }); + } + + private TableViewerColumn createSelectedTableViewerColumn( String title, int bound, int Style) { + + final TableViewerColumn viewerColumn = new TableViewerColumn( selectedPackageViewer, Style); + final TableColumn column = viewerColumn.getColumn(); + column.addSelectionListener(new SelectedTableSelectionAdapter()); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(true); + return viewerColumn; + } + + @Override + protected void okPressed() { + + for(RemotePackage p : RemotePkgProvider.INSTANCE.getPkgs()) { + if (p.getCheckColumn() && !Package.INSTALLINFO.INSTALLED.equals(p.getInstallInfo())) { + RemotePkgProvider.INSTANCE.getSelectedPkgs().add(p); + } + } + + super.okPressed(); + } + + private class TableSelectionAdapter extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) { + selectedColumn = packageViewer.getTable().indexOf((TableColumn) e.widget); + packageViewer.getTable().setSortColumn((TableColumn)e.widget); + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + packageViewer.getTable().setSortDirection(SWT.UP); + } else { + packageViewer.getTable().setSortDirection(SWT.DOWN); + } + + packageViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + int result = 0; + + InstalledPackage entry_1 = (InstalledPackage)e1; + InstalledPackage entry_2 = (InstalledPackage)e2; + + switch (selectedColumn) { + case 0: + if (packageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getName().compareTo(entry_2.getName()); + } else { + result = entry_2.getName().compareTo(entry_1.getName()); + } + break; + default: + break; + } + + return result; + } + }); + updateCheck(); + } + } + + private class SelectedTableSelectionAdapter extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) { + selectedColumn = selectedPackageViewer.getTable().indexOf((TableColumn) e.widget); + selectedPackageViewer.getTable().setSortColumn((TableColumn)e.widget); + if (selectedPackageViewer.getTable().getSortDirection() == SWT.DOWN) { + selectedPackageViewer.getTable().setSortDirection(SWT.UP); + } else { + selectedPackageViewer.getTable().setSortDirection(SWT.DOWN); + } + + selectedPackageViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + int result = 0; + + InstalledPackage entry_1 = (InstalledPackage)e1; + InstalledPackage entry_2 = (InstalledPackage)e2; + + switch (selectedColumn) { + case 0: + if (selectedPackageViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getName().compareTo(entry_2.getName()); + } else { + result = entry_2.getName().compareTo(entry_1.getName()); + } + break; + default: + break; + } + + return result; + } + }); + } + } + + private void updateCheck() { + int recentTableIndex = packageViewer.getTable().getItemCount(); + Color installedColor = disp.getSystemColor(SWT.COLOR_LIST_SELECTION); + + for (int i = 0; i < recentTableIndex; i++) { + TableItem item = packageViewer.getTable().getItem(i); + InstalledPackage pkg = (InstalledPackage)item.getData(); + item.setChecked(pkg.getCheckColumn()); + if (Package.INSTALLINFO.INSTALLED.equals(pkg.getInstallInfo())) { + item.setBackground(installedColor); + } + } + } + + private void afterUninstallPkgs(CopyOnWriteArrayList list) { + for (Package p : list) { + InstalledPkgProvider.INSTANCE.getPkgs().remove(p); + InstalledPkgProvider.INSTANCE.getSelectedPkgs().remove(p); + } + } + + private void refreshTable() { + packageViewer.refresh(); + selectedPackageViewer.refresh(); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RepoTableSelectionAdapter.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RepoTableSelectionAdapter.java new file mode 100644 index 0000000..ed586ab --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/pkgmgr/ui/RepoTableSelectionAdapter.java @@ -0,0 +1,86 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.pkgmgr.ui; + +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.TableColumn; +import org.tizen.nativeplatform.pkgmgr.model.Repository; + +public class RepoTableSelectionAdapter extends SelectionAdapter { + private TableViewer repoViewer; + private int selectedColumn = 0; + public RepoTableSelectionAdapter(TableViewer v) { + super(); + this.repoViewer = v; + } + + public void widgetSelected(SelectionEvent e) { + selectedColumn = repoViewer.getTable().indexOf((TableColumn) e.widget); + repoViewer.getTable().setSortColumn((TableColumn)e.widget); + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + repoViewer.getTable().setSortDirection(SWT.UP); + } else { + repoViewer.getTable().setSortDirection(SWT.DOWN); + } + + repoViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + int result = 0; + + Repository entry_1 = (Repository)e1; + Repository entry_2 = (Repository)e2; + + switch (selectedColumn) { + case 0: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getName().compareTo(entry_2.getName()); + } else { + result = entry_2.getName().compareTo(entry_1.getName()); + } + break; + case 1: + if (repoViewer.getTable().getSortDirection() == SWT.DOWN) { + result = entry_1.getUri().compareTo(entry_2.getUri()); + } else { + result = entry_2.getUri().compareTo(entry_1.getUri()); + } + break; + default: + break; + } + + return result; + } + }); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/PreferencesManager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/PreferencesManager.java new file mode 100644 index 0000000..dfd9074 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/PreferencesManager.java @@ -0,0 +1,638 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.preferences; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Arrays; + +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.core.net.proxy.IProxyData; +import org.eclipse.core.net.proxy.IProxyService; +import org.osgi.framework.FrameworkUtil; +import org.osgi.util.tracker.ServiceTracker; + + +public class PreferencesManager { + public static final String PASSWORD_KEY = "org.tizen.nativeplatform.sudo.password"; + + private static final String GIT_ACTIVE_CONFIG = "org.tizen.nativeplatform.git.active.config"; + private static final String GIT_CONFIG_NAME = "org.tizen.nativeplatform.site.config.name"; + private static final String GIT_BASE_URI = "org.tizen.nativeplatform.git.base.uri"; + private static final String GIT_LIST_TYPE = "org.tizen.nativeplatform.git.list.type"; + private static final String GIT_LIST_LOCATION = "org.tizen.nativeplatform.git.list.location"; + private static final String USE_SITE_PROXY = "org.tizen.nativeplatform.site.use.proxy"; + private static final String PROXY_URL = "rg.tizen.nativeplatform.site.use.proxy.url"; + private static final String GIT_CONFIG_DELIMITER = "|"; + public static final String GIT_LIST_WEB = "GITWEB"; + public static final String GIT_LIST_LOCAL = "LOCAL"; + private static final String DEFAULT_GIT_CONFIG_NAME = "Tizen-Public"; + private static final String DEFAULT_GIT_BASE_URI = "review.tizen.org"; + private static final String DEFAULT_GIT_LIST_TYPE = GIT_LIST_WEB; + private static final String DEFAULT_GIT_LIST_LOCATION = "https://review.tizen.org/git/"; + private static final boolean DEFAULT_USE_SITE_PROXY = false; + private static final String DEFAULT_PROXY_URL = ""; + private static final String GIT_LIST_CACHE_FILE_FORMAT = ".%s.index.html"; + + private static IPreferenceStore prefStore = org.tizen.nativecommon.Activator.getDefault().getPreferenceStore(); + private static ServiceTracker proxyTracker; + + public static void setDefaultValues() { + if ( !prefStore.contains(GIT_CONFIG_NAME) ) { + addSiteConfiguration(DEFAULT_GIT_CONFIG_NAME, + DEFAULT_GIT_BASE_URI, + DEFAULT_GIT_LIST_TYPE, + DEFAULT_GIT_LIST_LOCATION, + DEFAULT_USE_SITE_PROXY, + DEFAULT_PROXY_URL); + } + } + + + public static void setPassword(String p) { + prefStore.setValue(PASSWORD_KEY, p); + } + + + + public static boolean isProxyUsed() { + if ( isSiteProxyUsed() ) return true; + if ( isSystemProxyUsed() ) return true; + return false; + } + + + public static Proxy getProxy() { + if ( isProxyUsed() ) { + String host = getProxyHost(); + int port = getProxyPort(); + String protocol = getProxyProtocol(); + Proxy.Type proxyType; + if ( protocol.equals("http") || protocol.equals("https")) { + proxyType = Proxy.Type.HTTP; + } + else { + proxyType = Proxy.Type.SOCKS; + } + + return new Proxy(proxyType, new InetSocketAddress(host, port)); + } + else { + return null; + } + } + + + public static String getProxyURL() { + String proxyURL = getSiteProxyURL(); + if ( proxyURL == null ) { + proxyURL = getSystemProxyURL(); + } + + return proxyURL; + } + + + public static String getProxyProtocol() { + String proxyURL = getProxyURL(); + if ( proxyURL == null ) return null; + URL url; + + try { + url = new URL(proxyURL); + } catch (MalformedURLException e) { + e.printStackTrace(); + return null; + } + + return url.getProtocol(); + } + + + public static String getProxyHost() { + String proxyURL = getProxyURL(); + if ( proxyURL == null ) return null; + URL url; + + try { + url = new URL(proxyURL); + } catch (MalformedURLException e) { + e.printStackTrace(); + return null; + } + + return url.getHost(); + } + + + public static int getProxyPort() { + String proxyURL = getProxyURL(); + if ( proxyURL == null ) return -1; + URL url; + + try { + url = new URL(proxyURL); + } catch (MalformedURLException e) { + e.printStackTrace(); + return -1; + } + + return url.getPort(); + } + + + + + private static boolean isSiteProxyUsed() { + SiteConfiguration activeConf = loadActiveSiteConfiguration(); + if ( activeConf == null ) return false; + + return activeConf.isSiteProxyUsed; + } + + + private static String getSiteProxyURL() { + SiteConfiguration activeConf = loadActiveSiteConfiguration(); + if ( activeConf == null ) return null; + + if ( activeConf.isSiteProxyUsed ) { + return activeConf.proxyURL; + } + else { + return null; + } + } + + + private static boolean isSystemProxyUsed() { + return getSystemProxyURL() != null ? true:false; + } + + + private static String getSystemProxyURL() { + IProxyData data = getProxyData(IProxyData.SOCKS_PROXY_TYPE); + if ( data != null ) { + return String.format("socks://%s:%d", data.getHost(), data.getPort()); + } + + data = getProxyData(IProxyData.HTTP_PROXY_TYPE); + if ( data != null ) { + return String.format("http://%s:%d", data.getHost(), data.getPort()); + } + + data = getProxyData(IProxyData.HTTPS_PROXY_TYPE); + if ( data != null ) { + return String.format("https://%s:%d", data.getHost(), data.getPort()); + } + + return null; + } + + + public static String getHttpProxyURL() { + String proxyURL = getSiteProxyURL(); + if ( proxyURL != null && proxyURL.split(":")[0].equals("http") ) { + return proxyURL; + } + else { + IProxyData data = getProxyData(IProxyData.HTTP_PROXY_TYPE); + if ( data != null ) { + return String.format("http://%s:%d", data.getHost(), data.getPort()); + } + } + + return ""; + } + + + private static IProxyData getProxyData( String proxyType ) { + if ( proxyTracker == null ) { + proxyTracker = new ServiceTracker(FrameworkUtil.getBundle( + PreferencesManager.class).getBundleContext(), IProxyService.class + .getName(), null); + proxyTracker.open(); + } + + IProxyService service = proxyTracker.getService(); + if ( service.isProxiesEnabled() ) { + IProxyData data = service.getProxyData( proxyType ); + if ( data != null && data.getHost() != null && !data.getHost().isEmpty()) { + return data; + } + } + + return null; + } + + + public static String getPassword() { + return prefStore.getString(PASSWORD_KEY); + } + + + // Return current active base URI. + // and if no active one, return empty string + public static String getActiveGitBaseURI() { + ArrayList baseURIs = loadGitBaseURI(); + int activeId = prefStore.getInt(GIT_ACTIVE_CONFIG); + if (baseURIs.size() > 0 && activeId >= 0) { + return baseURIs.get(activeId); + } + else { + return ""; + } + } + + + // Return current active git list type. + // and if no active one, return empty string + public static String getActiveGitListType() { + ArrayList listTypes = loadGitListType(); + int activeId = prefStore.getInt(GIT_ACTIVE_CONFIG); + if (listTypes.size() > 0 && activeId >= 0) { + return listTypes.get(activeId); + } + else { + return ""; + } + } + + + // Return current active git list location. + // and if no active one, return empty string + public static String getActiveGitListLocation() { + ArrayList listLocations = loadGitListLocation(); + int activeId = prefStore.getInt(GIT_ACTIVE_CONFIG); + if (listLocations.size() > 0 && activeId >= 0) { + return listLocations.get(activeId); + } + else { + return ""; + } + } + + + public static synchronized SiteConfiguration loadActiveSiteConfiguration() { + ArrayList names = loadSiteConfigName(); + ArrayList baseURIs = loadGitBaseURI(); + ArrayList listTypes = loadGitListType(); + ArrayList listLocations = loadGitListLocation(); + ArrayList listUseSiteProxies = loadUseSiteProxies(); + ArrayList listProxyURLs = loadProxyURLs(); + + int activeId = prefStore.getInt(GIT_ACTIVE_CONFIG); + if ( activeId == -1 ) { + return null; + } + + SiteConfiguration newConfig = new SiteConfiguration( + names.get(activeId), + baseURIs.get(activeId), + listTypes.get(activeId), + listLocations.get(activeId), + listUseSiteProxies.get(activeId).equals("YES") ? true:false, + listProxyURLs.get(activeId)); + newConfig.setActive(true); + + return newConfig; + } + + + public static synchronized ArrayList loadSiteConfigurations() { + ArrayList names = loadSiteConfigName(); + ArrayList baseURIs = loadGitBaseURI(); + ArrayList listTypes = loadGitListType(); + ArrayList listLocations = loadGitListLocation(); + ArrayList listUseSiteProxies = loadUseSiteProxies(); + ArrayList listProxyURLs = loadProxyURLs(); + int activeId = prefStore.getInt(GIT_ACTIVE_CONFIG); + + ArrayList list = new ArrayList(); + for( int idx = 0; idx < names.size(); idx++ ) { + SiteConfiguration newConfig = new SiteConfiguration( names.get(idx), + baseURIs.get(idx), + listTypes.get(idx), + listLocations.get(idx), + listUseSiteProxies.get(idx).equals("YES") ? true:false, + listProxyURLs.get(idx) ); + if ( activeId == idx ) { + newConfig.setActive(true); + } + list.add( newConfig ); + } + + return list; + } + + + public static synchronized void addSiteConfiguration( String name, String baseURI, + String listType, String location, boolean useSiteProxy, String proxyURL ) { + + ArrayList newList = loadSiteConfigName(); + newList.add(name); + saveGitConfigName( newList ); + + newList = loadGitBaseURI(); + newList.add(baseURI); + saveGitBaseURI( newList ); + + newList = loadGitListType(); + newList.add(listType); + saveGitListType( newList ); + + newList = loadGitListLocation(); + newList.add(location); + saveGitListLocation( newList ); + + newList = loadUseSiteProxies(); + newList.add(useSiteProxy ? "YES": "NO"); + saveUseSiteProxies( newList ); + + newList = loadProxyURLs(); + newList.add(proxyURL); + saveProxyURLs( newList ); + + if (newList.size() == 1 ) + setActiveSiteConfiguration( 0 ); + } + + + public static synchronized void updateSiteConfiguration( int id, String name, String baseURI, + String listType, String location, boolean useSiteProxy, String proxyURL ) { + + ArrayList newList = loadSiteConfigName(); + newList.set(id, name); + saveGitConfigName( newList ); + + newList = loadGitBaseURI(); + newList.set(id, baseURI); + saveGitBaseURI( newList ); + + newList = loadGitListType(); + newList.set(id, listType); + saveGitListType( newList ); + + newList = loadGitListLocation(); + newList.set(id, location); + saveGitListLocation( newList ); + + newList = loadUseSiteProxies(); + newList.set(id, useSiteProxy ? "YES":"NO"); + saveUseSiteProxies( newList ); + + newList = loadProxyURLs(); + newList.set(id, proxyURL); + saveProxyURLs( newList ); + } + + + public static synchronized void setActiveSiteConfiguration( int id ) { + prefStore.setValue(GIT_ACTIVE_CONFIG, id); + } + + + public static synchronized void removeSiteConfiguration( int id ) { + ArrayList newList = loadSiteConfigName(); + newList.remove(id); + saveGitConfigName( newList ); + + newList = loadGitBaseURI(); + newList.remove(id); + saveGitBaseURI( newList ); + + newList = loadGitListType(); + newList.remove(id); + saveGitListType( newList ); + + newList = loadGitListLocation(); + newList.remove(id); + saveGitListLocation( newList ); + + int prevActiveId = prefStore.getInt(GIT_ACTIVE_CONFIG); + if ( prevActiveId == id ) { + if (newList.size() == 0 ) { + setActiveSiteConfiguration( -1 ); + } + else { + setActiveSiteConfiguration( 0 ); + } + } + else if ( prevActiveId > id ) { + setActiveSiteConfiguration( id - 1 ); + } + } + + + public static synchronized void refreshGitWebConfiguration( int idx ) throws IOException { + String name = loadSiteConfigName().get(idx); + String path = loadGitListLocation().get(idx); + + URL u = new URL(path); + String cacheFile = ResourcesPlugin.getWorkspace().getRoot().getLocation() + .append(String.format(GIT_LIST_CACHE_FILE_FORMAT, name)).toString(); + URLConnection yc = u.openConnection(); + BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); + BufferedWriter out = new BufferedWriter( new FileWriter( cacheFile ) ); + String line = null; + while ((line = in.readLine()) != null) { + out.write(line+"\n"); + } + } + + + private static ArrayList loadSiteConfigName() { + String values = prefStore.getString(GIT_CONFIG_NAME); + if ( !values.isEmpty() ) { + return new ArrayList(Arrays.asList( values.split("[|]") ) ); + } + else { + return new ArrayList(); + } + } + + + private static void saveGitConfigName(ArrayList list) { + prefStore.setValue(GIT_CONFIG_NAME, generateListString( list )); + } + + + private static ArrayList loadGitBaseURI() { + String values = prefStore.getString(GIT_BASE_URI); + if ( !values.isEmpty() ) { + return new ArrayList(Arrays.asList( values.split("[|]") ) ); + } + else { + return new ArrayList(); + } + } + + + private static void saveGitBaseURI( ArrayList list ) { + prefStore.setValue(GIT_BASE_URI, generateListString( list )); + } + + + private static ArrayList loadGitListType() { + String values = prefStore.getString(GIT_LIST_TYPE); + if ( !values.isEmpty() ) { + return new ArrayList(Arrays.asList( values.split("[|]") ) ); + } + else { + return new ArrayList(); + } + } + + + private static void saveGitListType( ArrayList list ) { + prefStore.setValue(GIT_LIST_TYPE, generateListString( list )); + } + + + private static ArrayList loadGitListLocation() { + String values = prefStore.getString(GIT_LIST_LOCATION); + if ( !values.isEmpty() ) { + return new ArrayList(Arrays.asList( values.split("[|]") ) ); + } + else { + return new ArrayList(); + } + } + + + private static void saveGitListLocation( ArrayList list ) { + prefStore.setValue(GIT_LIST_LOCATION, generateListString( list )); + } + + + private static ArrayList loadUseSiteProxies() { + String values = prefStore.getString(USE_SITE_PROXY); + if ( !values.isEmpty() ) { + return new ArrayList(Arrays.asList( values.split("[|]") ) ); + } + else { + return new ArrayList(); + } + } + + + private static void saveUseSiteProxies( ArrayList list ) { + prefStore.setValue(USE_SITE_PROXY, generateListString( list )); + } + + + private static ArrayList loadProxyURLs() { + String values = prefStore.getString(PROXY_URL); + if ( !values.isEmpty() ) { + ArrayList newList = new ArrayList(); + for( String url: values.split("[|]") ) { + if ( url.equals("EMPTY") ) { + newList.add(""); + } + else { + newList.add(url); + } + } + + return newList; + } + else { + return new ArrayList(); + } + } + + + private static void saveProxyURLs( ArrayList list ) { + ArrayList newList = new ArrayList(); + for( String url: list ) { + if ( url.isEmpty() ) { + newList.add("EMPTY"); + } + else { + newList.add(url); + } + } + + prefStore.setValue(PROXY_URL, generateListString( newList )); + } + + + private static String generateListString( ArrayList list ) { + String newList = ""; + for( String item : list ) { + if ( newList.length() != 0 ) newList += GIT_CONFIG_DELIMITER; + newList += item; + } + + return newList; + } + + + public static class SiteConfiguration { + public String name; + public String baseURI; + public String listType; + public String listLocation; + public boolean isActive; + public boolean isSiteProxyUsed; + public String proxyURL; + + public SiteConfiguration(String name1, String baseURI1, String listType1, String listLocation1, + boolean isSiteProxyUsed1, String proxyURL1 ) { + name = name1; + baseURI = baseURI1; + listType = listType1; + listLocation = listLocation1; + isSiteProxyUsed = isSiteProxyUsed1; + proxyURL = proxyURL1; + + isActive = false; + } + + public void setActive( boolean value ) { + isActive = value; + } + + + public String getListCacheFile() { + return ResourcesPlugin.getWorkspace().getRoot().getLocation() + .append(String.format(GIT_LIST_CACHE_FILE_FORMAT, name)).toString(); + } + } + + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/GitConfUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/GitConfUIMessages.properties new file mode 100644 index 0000000..56bba5e --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/GitConfUIMessages.properties @@ -0,0 +1,45 @@ +GitConfDlg.Title.Add = Add Git Configuration +GitConfDlg.Title.Edit = Edit Git Configuration +GitConfDlg.Label.GitListFile = Git List File: +GitConfDlg.Label.GitWeb = Git Web Address: +GitConfDlg.Label.SshConn = SSH Alias: +GitConfDlg.Group.Desc = How to get git list + +GitConfDlg.Info.Input.SshConn = SSH alias should be input for cloning git project +GitConfDlg.Info.Input.GitWeb = Git web address should be input for listing git project +GitConfDlg.Info.Input.GitListFile = Git list file should be input for listing git project + +SiteConfDlg.Label.ConfigName = Name: + +SiteConfDlg.Group.Git = Git Configuration +SiteConfDlg.Label.GitBaseURI = Git Base URI: +SiteConfDlg.Label.GitBaseURI.Ex = ex) ssh://myid:mypasswd@my.host.name:29418 +SiteConfDlg.Label.GitListType = Type: +SiteConfDlg.Label.GitListLocation = Location: +SiteConfDlg.Button.Browse = Browse + +SiteConfDlg.Group.Proxy = Proxy Configuration +SiteConfDlg.Button.UseSiteProxy = Use Site Proxy +SiteConfDlg.Label.ProxyURL = Proxy URL: +SiteConfDlg.Label.ProxyURL.Ex = ex) http://proxy.host.name:8080 + +GitConfPref.Button.Add = Add +GitConfPref.Button.Edit = Edit +GitConfPref.Button.Remove = Remove +GitConfPref.Button.SetActive = Set Active +GitConfPref.Button.Update = Update +GitConfPref.Text.ConfName = Name +GitConfPref.Text.GitList = Git List +GitConfPref.Text.SshConn = SSH Alias +GitConfPref.Column.Name = Name +GitConfPref.Column.URI = URI +GitConfPref.Column.Type = Type + +FileDlg.Title = File Dialog +FileDlg.Filter.Ext = txt + +GitConfDlg.Error.NoName = Must specify configuration name field! +GitConfDlg.Error.NoBaseURI = Must specify base URI field! +GitConfDlg.Error.NoLocation = Must specify location field! +GitConfDlg.Error.NoProxyURL = Must specify proxy URL! +GitConfDlg.Error.MalformedURL = Malformed URL is used! \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PasswdConfDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PasswdConfDialog.java new file mode 100644 index 0000000..8068d92 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PasswdConfDialog.java @@ -0,0 +1,102 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.preferences.ui; + +import java.util.ResourceBundle; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class PasswdConfDialog extends Dialog { + + private final String BUNDLE_NAME = PasswdConfDialog.class.getPackage().getName() + ".PlatformUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private Text passwdText; + private String password = ""; + + + public PasswdConfDialog(Shell parentShell, String password) { + super(parentShell); + + this.password = password; + } + + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("PasswdInputDlg.Title")); + + Rectangle bounds = newShell.getBounds(); + int width = 300; + int height = 150; + int x = bounds.x + (bounds.width - width)/2; + int y = bounds.y + (bounds.height - height)/2; + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + passwdText = new Text(composite, SWT.SINGLE|SWT.PASSWORD|SWT.BORDER ); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.minimumHeight = 0; + passwdText.setLayoutData(gridData); + passwdText.setText(password); + + return parent; + } + + + @Override + protected void okPressed() { + password = passwdText.getText().trim(); + + super.okPressed(); + } + + + public String getPassword() { + return password; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformPreferencePage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformPreferencePage.java new file mode 100644 index 0000000..c7ba92e --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformPreferencePage.java @@ -0,0 +1,121 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.preferences.ui; + +import java.util.ResourceBundle; + +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +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.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public class PlatformPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { + + private final String BUNDLE_NAME = PlatformPreferencePage.class.getPackage().getName() + ".PlatformUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private String password = ""; + Text passwdText; + + public PlatformPreferencePage() { + String description = "General settings for developing platform project"; + setDescription( description ); + } + + @Override + public void init(IWorkbench workbench) { + updateData(); + } + + private void updateData() { + password = PreferencesManager.getPassword(); + if ( passwdText != null ) { + passwdText.setText(password); + } + } + + + @Override + protected Control createContents(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout(1, false)); + composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); + + createSudoPasswordComposite(parent); + return parent; + } + + + private void createSudoPasswordComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(3, false)); + + Label proxyLabel = new Label(composite, SWT.NONE); + proxyLabel.setText(resources.getString("ConfPref.Text.Password")); + + passwdText = new Text(composite, SWT.SINGLE | SWT.READ_ONLY| SWT.PASSWORD| SWT.BORDER); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + passwdText.setLayoutData(gridData); + passwdText.setText(password); + + Button modifyBt = new Button(composite, SWT.PUSH); + modifyBt.setText(resources.getString("ConfPref.Button.Change")); + + modifyBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + PasswdConfDialog dialog = new PasswdConfDialog(getShell(), password); + if (dialog.open() == PasswdConfDialog.OK) { + PreferencesManager.setPassword(dialog.getPassword()); + updateData(); + } + + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformUIMessages.properties new file mode 100644 index 0000000..e333079 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/PlatformUIMessages.properties @@ -0,0 +1,6 @@ +ConfPref.Button.Add = Add + +ConfPref.Text.Password = Password: +ConfPref.Button.Change = Change + +PasswdInputDlg.Title = Input password! diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationDialog.java new file mode 100644 index 0000000..5bbcaf2 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationDialog.java @@ -0,0 +1,434 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.preferences.ui; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ResourceBundle; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativeplatform.preferences.PreferencesManager; + +public class SiteConfigurationDialog extends Dialog { + + private Text siteConfigNameText; + private Text gitBaseURIText; + private Combo gitListTypeCombo; + private Text gitListLocationText; + private Button fileBrowseBt; + private Button useSiteProxyBt; + private Text proxyURLText; + + private String siteConfigName = ""; + private String gitBaseURI = ""; + private String gitListType = ""; + private String gitListLocation = ""; + private boolean useSiteProxy = false; + private String proxyURL = ""; + + private int x = 0; + private int y = 0; + private final int width = 500; + private Shell shell; + + private final String BUNDLE_NAME = SiteConfigurationDialog.class.getPackage().getName() + ".GitConfUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + protected SiteConfigurationDialog(Shell parentShell ) { + super(parentShell); + siteConfigName = ""; + gitBaseURI = ""; + gitListType = ""; + gitListLocation = ""; + useSiteProxy= false; + proxyURL = ""; + + this.shell = parentShell; + } + + + protected SiteConfigurationDialog(Shell parentShell, + String gitConfigName1, String gitBaseURI1 , String gitListType1, String gitListLocation1, + boolean useSiteProxy1, String proxyURL1 ) { + super(parentShell); + + siteConfigName = gitConfigName1; + gitBaseURI = gitBaseURI1; + gitListType = gitListType1; + gitListLocation = gitListLocation1; + useSiteProxy= useSiteProxy1; + proxyURL = proxyURL1; + + this.shell = parentShell; + } + + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + if ( siteConfigName == "" ) { + newShell.setText(resources.getString("GitConfDlg.Title.Add")); + } + else { + newShell.setText(resources.getString("GitConfDlg.Title.Edit")); + } + Rectangle bounds = newShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + newShell.setLocation(x, y); + newShell.setMinimumSize(width, 0); + } + + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + createSiteConfigNameComposite(composite); + createGitConfigGroupComposite( composite ); + createProxyConfigGroupComposite( composite ); + + return null; + } + + + private void createSiteConfigNameComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(2, false)); + + Label configNameLabel = new Label(composite, SWT.NONE); + GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 50; + configNameLabel.setLayoutData(gridData); + configNameLabel.setAlignment(SWT.RIGHT); + configNameLabel.setText(resources.getString("SiteConfDlg.Label.ConfigName")); + + siteConfigNameText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.minimumWidth = 200; + siteConfigNameText.setLayoutData(gridData); + siteConfigNameText.setText(siteConfigName); + } + + + private void createGitConfigGroupComposite(Composite parent) { + Group group = new Group(parent, SWT.NONE); + group.setLayout(new GridLayout(3, false)); + group.setText(resources.getString("SiteConfDlg.Group.Git")); + GridData gridData = new GridData(GridData.FILL_BOTH); + group.setLayoutData(gridData); + + createGitBaseURIComposite(group); + createGitListComposite(group); + } + + + private void createGitBaseURIComposite(Composite composite) { + + Label gitBaseURILebel = new Label(composite, SWT.NONE); + GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 100; + gitBaseURILebel.setLayoutData(gridData); + gitBaseURILebel.setAlignment(SWT.RIGHT); + gitBaseURILebel.setText(resources.getString("SiteConfDlg.Label.GitBaseURI")); + + gitBaseURIText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.horizontalSpan = 2; + gitBaseURIText.setLayoutData(gridData); + gitBaseURIText.setText(gitBaseURI); + + new Label( composite, SWT.NONE ); + + Label gitBaseURIExLabel = new Label(composite, SWT.NONE); + gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + gridData.horizontalSpan = 2; + gitBaseURIExLabel.setLayoutData(gridData); + gitBaseURIExLabel.setText(resources.getString("SiteConfDlg.Label.GitBaseURI.Ex")); + + } + + + private void createGitListComposite(Composite composite) { + + Label gitListTypeLebel = new Label(composite, SWT.NONE); + GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 100; + gitListTypeLebel.setLayoutData(gridData); + gitListTypeLebel.setAlignment(SWT.RIGHT); + gitListTypeLebel.setText(resources.getString("SiteConfDlg.Label.GitListType")); + + gitListTypeCombo = new Combo(composite, SWT.READ_ONLY); + gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.horizontalSpan = 2; + gitListTypeCombo.setLayoutData(gridData); + String newItems[] = { PreferencesManager.GIT_LIST_LOCAL, PreferencesManager.GIT_LIST_WEB }; + gitListTypeCombo.setItems(newItems); + gitListTypeCombo.addSelectionListener( new SelectionListener(){ + + @Override + public void widgetSelected(SelectionEvent e) { + + if (gitListTypeCombo.getText().equals( PreferencesManager.GIT_LIST_LOCAL ) ) { + fileBrowseBt.setEnabled(true); + } + else { + fileBrowseBt.setEnabled(false); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + }); + if ( gitListType.isEmpty() || gitListType.equals(PreferencesManager.GIT_LIST_LOCAL) ) { + gitListTypeCombo.select(0); + } + else { + gitListTypeCombo.select(1); + } + + Label gitListLocationLabel = new Label(composite, SWT.NONE); + gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 100; + gitListLocationLabel.setLayoutData(gridData); + gitListLocationLabel.setAlignment(SWT.RIGHT); + gitListLocationLabel.setText(resources.getString("SiteConfDlg.Label.GitListLocation")); + + createGitListLocationComposite(composite); + } + + + private void createGitListLocationComposite(Composite composite) { + + gitListLocationText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + GridData gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gitListLocationText.setLayoutData(gridData); + gitListLocationText.setText(gitListLocation); + + fileBrowseBt = new Button(composite, SWT.PUSH); + fileBrowseBt.setText(resources.getString("SiteConfDlg.Button.Browse")); + + fileBrowseBt.addMouseListener(new MouseListener() + { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + FileDialog fd = new FileDialog( shell, SWT.OPEN); + fd.setText(resources.getString("FileDlg.Title")); + String listPath = gitListLocationText.getText(); + + if (!listPath.isEmpty()) { + IPath p = new Path(listPath); + listPath = p.removeLastSegments(1).toString(); + } + + fd.setFilterPath(listPath); + + String selectedFileList = fd.open(); + if (selectedFileList != null) { + gitListLocationText.setText(selectedFileList.trim()); + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + } + + + private void createProxyConfigGroupComposite( Composite parent ) { + Group group = new Group(parent, SWT.NONE); + group.setLayout(new GridLayout(2, false)); + group.setText(resources.getString("SiteConfDlg.Group.Proxy")); + GridData gridData = new GridData(GridData.FILL_BOTH); + group.setLayoutData(gridData); + + // check box + useSiteProxyBt = new Button(group, SWT.CHECK); + useSiteProxyBt.setText(resources.getString("SiteConfDlg.Button.UseSiteProxy")); + gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); + gridData.horizontalSpan = 2; + useSiteProxyBt.setLayoutData(gridData); + useSiteProxyBt.setSelection(useSiteProxy); + useSiteProxyBt.addSelectionListener( new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + useSiteProxy = useSiteProxyBt.getSelection(); + proxyURLText.setEnabled(useSiteProxy); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + }); + + // label , text + Label proxyURLLabel = new Label(group, SWT.NONE); + gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 100; + proxyURLLabel.setLayoutData(gridData); + proxyURLLabel.setAlignment(SWT.RIGHT); + proxyURLLabel.setText(resources.getString("SiteConfDlg.Label.ProxyURL")); + + proxyURLText = new Text(group, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + proxyURLText.setLayoutData(gridData); + proxyURLText.setText(proxyURL); + if ( !useSiteProxy ) proxyURLText.setEnabled(false); + + new Label( group, SWT.NONE ); + + Label gitBaseURIExLabel = new Label(group, SWT.NONE); + gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + gitBaseURIExLabel.setLayoutData(gridData); + gitBaseURIExLabel.setText(resources.getString("SiteConfDlg.Label.ProxyURL.Ex")); + } + + + @Override + protected void okPressed() { + siteConfigName = siteConfigNameText.getText().trim(); + gitBaseURI = gitBaseURIText.getText().trim(); + gitListType = gitListTypeCombo.getText(); + gitListLocation = gitListLocationText.getText().trim(); + useSiteProxy = useSiteProxyBt.getSelection(); + proxyURL = proxyURLText.getText().trim(); + + if ( siteConfigName.isEmpty()) { + DialogUtil.openErrorDialog(resources.getString("GitConfDlg.Error.NoName")); + return; + } + if ( gitBaseURI.isEmpty() ) { + DialogUtil.openErrorDialog(resources.getString("GitConfDlg.Error.NoBaseURI")); + return; + } + if ( gitListLocation.isEmpty() ) { + DialogUtil.openErrorDialog(resources.getString("GitConfDlg.Error.NoLocation")); + return; + } + if ( useSiteProxy ) { + if ( proxyURL.isEmpty() ) { + DialogUtil.openErrorDialog(resources.getString("GitConfDlg.Error.NoProxyURL")); + } + + try { + URL url = new URL(proxyURL); + String protocol = url.getProtocol(); + String host = url.getHost(); + int port = url.getPort(); + + if ( ( protocol.compareToIgnoreCase("socks") != 0 && + protocol.compareToIgnoreCase("http") != 0 && + protocol.compareToIgnoreCase("https") != 0 ) || + host == null ||host.isEmpty() ) { + DialogUtil.openErrorDialog(resources.getString("GitConfDlg.Error.MalformedURL")); + return; + } + // use default port + if ( port == -1 ) port = 8080; + + // make new URL + proxyURL = String.format("%s://%s:%d", protocol, host, port); + + } catch (MalformedURLException e) { + DialogUtil.openErrorDialog(resources.getString("GitConfDlg.Error.MalformedURL")); + return; + } + + } + + super.okPressed(); + } + + public String getSiteConfigName() { + return siteConfigName; + } + + + public String getGitBaseURI() { + return gitBaseURI; + } + + + public String getGitListType() { + return gitListType; + } + + + public String getGitListLocation() { + return gitListLocation; + } + + + public boolean isSiteProxyUsed() { + return useSiteProxy; + } + + + public String getProxyURL() { + if ( useSiteProxy ) { + return proxyURL; + } + else { + return ""; + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationPreferencePage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationPreferencePage.java new file mode 100644 index 0000000..60540e8 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/preferences/ui/SiteConfigurationPreferencePage.java @@ -0,0 +1,413 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.preferences.ui; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.Image; +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.Control; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; +import org.tizen.common.util.DialogUtil; +import org.tizen.nativeplatform.preferences.PreferencesManager; + + +public class SiteConfigurationPreferencePage extends PreferencePage implements IWorkbenchPreferencePage{ + + private ArrayList siteConfigList; + private TableViewer gitConfigTable; + private Button addBt; + private Button editBt; + private Button updateBt; + private Button setActiveBt; + private Button removeBt; + + private final String BUNDLE_NAME = SiteConfigurationPreferencePage.class.getPackage().getName() + ".GitConfUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + public SiteConfigurationPreferencePage() { + siteConfigList = new ArrayList(); + } + + @Override + public void init(IWorkbench workbench) { + updateData(); + } + + @Override + public void createControl(Composite parent) { + super.createControl(parent); + Button defaultButton = getDefaultsButton(); + if (defaultButton != null) { + defaultButton.setVisible(false); + } + + Button applyButton = getApplyButton(); + + if(applyButton != null) { + applyButton.setVisible(false); + } + } + + @Override + protected Control createContents(Composite parent) { + initializeDialogUnits(parent); + + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + layout.marginWidth = 0; + layout.marginHeight = 0; + composite.setLayout(layout); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + createGitDetailTableComposite(composite); + + return parent; + } + + private void createGitDetailTableComposite(Composite parent) { + + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(2, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + composite.setLayout(gridLayout); + composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING)); + + createDetailTableComposite(composite); + createGitButtonComposite(composite); + } + + private void createDetailTableComposite(Composite composite) { + + gitConfigTable = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + Table table = gitConfigTable.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + gitConfigTable.setLabelProvider(new TableViewerProvider()); + gitConfigTable.setContentProvider(new ArrayContentProvider()); + + TableColumn column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("GitConfPref.Column.Name")); + column.setWidth(150); + + column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("GitConfPref.Column.URI")); + column.setWidth(300); + + column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("GitConfPref.Column.Type")); + column.setWidth(50); + + GridData tableGridData = new GridData(GridData.FILL_HORIZONTAL|GridData.VERTICAL_ALIGN_BEGINNING); + tableGridData.heightHint = 200; + table.setLayoutData(tableGridData); + + gitConfigTable.addSelectionChangedListener( new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + int idx = gitConfigTable.getTable().getSelectionIndex(); + if ( idx != -1 ) { + String gitListType = siteConfigList.get(idx).listType; + if ( gitListType.equals(PreferencesManager.GIT_LIST_WEB) ) { + updateBt.setEnabled(true); + } + else { + updateBt.setEnabled(false); + } + editBt.setEnabled(true); + setActiveBt.setEnabled(true); + removeBt.setEnabled(true); + } + else { + updateBt.setEnabled(false); + editBt.setEnabled(false); + setActiveBt.setEnabled(false); + removeBt.setEnabled(false); + } + } + + }); + + gitConfigTable.setInput(siteConfigList); + } + + + private void updateData() { + siteConfigList = PreferencesManager.loadSiteConfigurations(); + + if (gitConfigTable != null ) { + gitConfigTable.setInput(siteConfigList); + } + } + + + private void createGitButtonComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + + composite.setLayout(gridLayout); + composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING)); + + addBt = new Button(composite, SWT.PUSH); + addBt.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + addBt.setText(resources.getString("GitConfPref.Button.Add")); + addBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + SiteConfigurationDialog dialog = new SiteConfigurationDialog(getShell()); + + if (dialog.open() == SiteConfigurationDialog.OK) { + PreferencesManager.addSiteConfiguration( + dialog.getSiteConfigName(), + dialog.getGitBaseURI(), + dialog.getGitListType(), + dialog.getGitListLocation(), + dialog.isSiteProxyUsed(), + dialog.getProxyURL()); + + updateData(); + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + + editBt = new Button(composite, SWT.PUSH); + editBt.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + editBt.setEnabled(false); + editBt.setText(resources.getString("GitConfPref.Button.Edit")); + + editBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + int idx = gitConfigTable.getTable().getSelectionIndex(); + String siteConfigName = siteConfigList.get(idx).name; + String gitBaseURI = siteConfigList.get(idx).baseURI; + String gitListType = siteConfigList.get(idx).listType; + String gitListLocation = siteConfigList.get(idx).listLocation; + boolean useSiteProxy = siteConfigList.get(idx).isSiteProxyUsed; + String proxyURL = siteConfigList.get(idx).proxyURL; + + SiteConfigurationDialog dialog = new SiteConfigurationDialog(getShell(), + siteConfigName, gitBaseURI, gitListType, gitListLocation, + useSiteProxy, proxyURL ); + if (dialog.open() == SiteConfigurationDialog.OK) { + PreferencesManager.updateSiteConfiguration( + gitConfigTable.getTable().getSelectionIndex(), + dialog.getSiteConfigName(), + dialog.getGitBaseURI(), + dialog.getGitListType(), + dialog.getGitListLocation(), + dialog.isSiteProxyUsed(), + dialog.getProxyURL() ); + updateData(); + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + updateBt = new Button(composite, SWT.PUSH); + updateBt.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + updateBt.setEnabled(false); + updateBt.setText(resources.getString("GitConfPref.Button.Update")); + updateBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + try { + new ProgressMonitorDialog(getShell()).run(true, false, + new RefreshGitWebOperation(gitConfigTable.getTable().getSelectionIndex())); + DialogUtil.openMessageDialog("Refreshing Git Web succeeded!"); + } catch (InvocationTargetException e1) { + DialogUtil.openErrorDialog( "Refreshing Git Web Failed!\n:"+e1.getMessage()); + } catch (InterruptedException e1) { + // do nothing + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + setActiveBt = new Button(composite, SWT.PUSH); + setActiveBt.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + setActiveBt.setEnabled(false); + setActiveBt.setText(resources.getString("GitConfPref.Button.SetActive")); + + setActiveBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + PreferencesManager.setActiveSiteConfiguration( + gitConfigTable.getTable().getSelectionIndex()); + + updateData(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + removeBt = new Button(composite, SWT.PUSH); + removeBt.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + removeBt.setEnabled(false); + removeBt.setText(resources.getString("GitConfPref.Button.Remove")); + + removeBt.addMouseListener(new MouseListener(){ + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + PreferencesManager.removeSiteConfiguration( + gitConfigTable.getTable().getSelectionIndex()); + updateData(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + + } + + @Override + public boolean performOk() { + return super.performOk(); + } + + private class TableViewerProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + @Override + public String getColumnText(Object element, int columnIndex) { + PreferencesManager.SiteConfiguration config = (PreferencesManager.SiteConfiguration)element; + + switch(columnIndex) { + case 0: + if ( config.isActive ) { + return config.name + " (Active)"; + } + else { + return config.name; + } + case 1: + return config.baseURI; + case 2: + return config.listType; + + default: + return ""; + } + } + } + + + class RefreshGitWebOperation implements IRunnableWithProgress { + private int idx; + + public RefreshGitWebOperation(int idx1) { + idx = idx1; + } + + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask("Refreshing Git Web...", IProgressMonitor.UNKNOWN); + try { + PreferencesManager.refreshGitWebConfiguration(idx); + } catch (IOException e) { + throw new InvocationTargetException(e, e.getMessage()); + } + monitor.done(); + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/IRootstrapChangedListener.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/IRootstrapChangedListener.java new file mode 100644 index 0000000..211e68f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/IRootstrapChangedListener.java @@ -0,0 +1,33 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.rootstrap; + +public interface IRootstrapChangedListener { + void rootstrapChanged(); + void selectionChanged(String rootName); +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/RootstrapManager.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/RootstrapManager.java new file mode 100644 index 0000000..01a6a06 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/RootstrapManager.java @@ -0,0 +1,746 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.rootstrap; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.tizen.common.core.application.InstallPathConfig; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativecommon.build.model.Rootstrap; +import org.tizen.nativecommon.build.model.SBIModel; +import org.tizen.nativecommon.build.model.Target; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.nativeplatform.util.CommandLauncher; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +public class RootstrapManager { + + private static ArrayList rootstraps = new ArrayList(); + private static PlatformRootstrap selectedRootstrap; + public static Set changedListener = new HashSet(); + + private static boolean init; + private static final String URL_SEP = "|"; + private static final String URL_SEP_REGEXP = "[|]"; + private static final String USER_ROOSTRAP_BASE_DIR_NAME = "user-rootstraps"; + + private RootstrapManager() { + } + + private synchronized static void initialize() { + + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + try { + ArrayList lists = sbi.getRootstrapList(); + for (String id : lists) { + String type = sbi.getSupportToolchainTypeFromRootstrapID(id); + if (!type.equals(PlatformRootstrap.SUPPORTED_TOOLCHAIN_TYPE)) { + continue; + } + + String rootName = sbi.getRootstrapNameFromRootstrapID(id); + String arch = sbi.getArchitectureFromRootstrapID(id); + String path = sbi.getRootstrapPathFromRootstrapID(id); + ArrayList reposURLs = new ArrayList(); + String rootstrapPath = sbi.getRootstrapPropertyValue(id, "REPOSITORY_URLS"); + if ( rootstrapPath != null && rootstrapPath.split(URL_SEP_REGEXP).length >= 1 ) { + for ( String url : rootstrapPath.split(URL_SEP_REGEXP) ) { + reposURLs.add( url ); + } + } + boolean initialized = new File(path).exists() ? true : false; + addRootstrap( new PlatformRootstrap(id, rootName, arch, path, + reposURLs, initialized) ); + } + } catch (SBIException e) { + e.printStackTrace(); + } + + init = true; + } + + + public static PlatformRootstrap addRootstrap(PlatformRootstrap rootstrap ) { + rootstraps.add(rootstrap); + //SBIModel.addRootstrap(rootstrap, false); + try { + SBIModel.reinitialize(); + } catch (SBIException e) { + // nothing to do + e.printStackTrace(); + } + RootstrapManager.notifyChangedRootstrap(); + + return rootstrap; + } + + + public static void modifyRootstrap(PlatformRootstrap rootstrap) { + generateSBIPluginXML(rootstrap.getId(), rootstrap.getName(), + rootstrap.getArch(), rootstrap.getPath().toOSString(), rootstrap.getRepositoryURLs() ); + try { + SBIModel.reinitialize(); + reinitialize(); + } catch (SBIException e) { + // nothing to do + e.printStackTrace(); + } + RootstrapManager.notifyChangedRootstrap(); + } + + + public static boolean removeRootstrap(String id) { + PlatformRootstrap rootstrap = getRootstrap( id ); + + if ( rootstrap != null ) { + rootstraps.remove( rootstrap ); + removeSBIPluginXML( rootstrap ); + try { + removeBaseFileSystem( rootstrap.getId() , rootstrap.getArch()); + } catch (InterruptedException e) { + // nothing to do + e.printStackTrace(); + } + try { + SBIModel.reinitialize(); + } catch (SBIException e) { + // nothing to do + e.printStackTrace(); + } + RootstrapManager.notifyChangedRootstrap(); + return true; + } + else { + return false; + } + } + + + public static boolean exportRootstrap( + PlatformRootstrap rootstrap, String exportFilePath, + IProgressMonitor monitor) throws InterruptedException { + + // make temp directory + String tempDirPath = makeTempDirectory(); + + try { + // zip file-system + String basePath = rootstrap.getPath().removeLastSegments(1).toOSString(); + File dir = new File(rootstrap.getPath().append("local").toOSString()); + String scratchName = ""; + String list[] = dir.list(); + for (String s : list) { + if (s.startsWith("scratch.")) { + scratchName = s; + } + } + + String rootstrapID = rootstrap.getId(); + + if( !CommandLauncher.execute( String.format("tar cvzf %s/rootstrap1.tar.gz %s --exclude=local/%s", + tempDirPath, rootstrapID, scratchName), basePath, "Platform Internal", monitor ) ) { + return false; + } + + if( !CommandLauncher.executeSudo( String.format("sudo -S tar cvzf %s/rootstrap2.tar.gz %s/local/%s --exclude=home/abuild --exclude=etc/passwd", + tempDirPath, rootstrapID, scratchName), basePath, "Platform Internal", monitor ) ) { + return false; + } + + // copy xml + String pluginFileName = rootstrap.getId() + ".xml"; + String pluginPath = new Path(SmartBuildInterface.getInstance().getPluginPath()) + .append(pluginFileName).toOSString(); + if ( !CommandLauncher.execute( String.format("cp %s %s/", pluginPath, tempDirPath )) ) { + return false; + } + + // zip them together + if ( !CommandLauncher.execute( String.format("tar cvf %s rootstrap1.tar.gz rootstrap2.tar.gz %s", + exportFilePath, pluginFileName), tempDirPath, "Platform Internal", monitor ) ) { + return false; + } + + return true; + } + finally { + // remove temporary directory + CommandLauncher.executeSudo( String.format("sudo -S rm -rf %s",tempDirPath) ); + } + } + + + public static PlatformRootstrap importRootstrap( String importFilePath, + IProgressMonitor monitor) throws InterruptedException { + + PlatformRootstrap result = null; + String pluginPath = null; + String rootstrapPath = null; + + // make temp directory + String tempDirPath = makeTempDirectory(); + + try { + // extract "tar" archive + if( !CommandLauncher.execute( String.format("tar xvf %s", + importFilePath), tempDirPath, "Platform Internal", monitor ) ) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("Extracting rootsrap failed!"); + } + + // find rootstrap id + File tempDir = new File(tempDirPath); + File[] xmlFiles = tempDir.listFiles( new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + if( name.endsWith(".xml") ) { + return true; + } + else { + return false; + } + } + + } ); + if ( xmlFiles.length == 0 ) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("There is no SBI plugin file(*.xml)"); + } + String pluginFilePath = xmlFiles[0].getPath().toString(); + String pluginFileName = new File(pluginFilePath).getName(); + String pluginId = pluginFileName.split("\\.xml")[0]; + + // check already exist? + if( RootstrapManager.getRootstrap(pluginId) != null ) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("There already exists the rootrap with same id!"); + } + + // copy xml + pluginPath = new Path(SmartBuildInterface.getInstance().getPluginPath()) + .append(pluginFileName).toOSString(); + CommandLauncher.execute( String.format("cp %s %s", pluginFilePath, pluginPath)); + + // reload + try { + SBIModel.reinitialize(); + } catch (SBIException e) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("SBIModel initialization failed!"); + } + result = createRootstrapFromSBIPlugin( pluginId ); + if ( result == null ) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("Loading SBI plugin failed!"); + } + + // extracting file system + rootstrapPath = result.getPath().toOSString(); + File baseDirDir = new File(rootstrapPath).getParentFile(); + if ( !baseDirDir.exists() ) { + baseDirDir.mkdir(); + } + else if ( new File(rootstrapPath).exists() ) { + CommandLauncher.executeSudo( String.format("sudo -S rm -rf %s", rootstrapPath), null ); + } + + if ( !CommandLauncher.execute( String.format("tar xvf %s/rootstrap1.tar.gz", + tempDirPath), baseDirDir.getPath(), "Platform Internal", monitor ) ) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("Extracting rootsrap failed!"); + } + + if ( !CommandLauncher.executeSudo( String.format("sudo -S tar xvf %s/rootstrap2.tar.gz", + tempDirPath), baseDirDir.getPath(), "Platform Internal", monitor ) ) { + cleanUpRootstrap(pluginPath, rootstrapPath); + throw new InterruptedException("Extracting rootsrap failed!"); + } + + return result; + } + finally { + // remove temporary directory + CommandLauncher.executeSudo( String.format("sudo -S rm -rf %s",tempDirPath), null ); + } + } + + private static void cleanUpRootstrap(String pluginPath, String rootstrapPath) + throws InterruptedException{ + if ( pluginPath != null ) { + CommandLauncher.execute( String.format("rm -rf %s", pluginPath) ); + try { + SBIModel.reinitialize(); + } catch (SBIException e1) { + throw new InterruptedException(e1.getMessage()); + } + } + if ( rootstrapPath != null ) { + CommandLauncher.executeSudo( String.format("sudo -S rm -rf %s", rootstrapPath), null ); + } + } + + + private static String makeTempDirectory() { + final File temp; + + try { + temp = File.createTempFile("temp", Long.toString(System.nanoTime())); + if(!(temp.delete())) + { + throw new IOException("Could not delete temp file: " + temp.getAbsolutePath()); + } + + if(!(temp.mkdir())) + { + throw new IOException("Could not create temp directory: " + temp.getAbsolutePath()); + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + return temp.getPath(); + } + + + public static ArrayList getRootstraps() { + checkInit(); + + return rootstraps; + } + + + public static PlatformRootstrap getRootstrap(String id) { + checkInit(); + + for (PlatformRootstrap r : rootstraps) { + if (r.getId().equals(id)) { + return r; + } + } + + return null; + } + + + public static PlatformRootstrap getDefaultRootstrap( String arch ) { + String defaultRootstrapID = null; + if (PlatformConfigurationManager.isEmulatorArch(arch)) { + defaultRootstrapID = PlatformRootstrap.DEFAULT_ROOTSTRAP_I386_ID; + } else if (PlatformConfigurationManager.isDeviceArch(arch)) { + defaultRootstrapID = PlatformRootstrap.DEFAULT_ROOTSTRAP_ARM_ID; + } + + return RootstrapManager.getRootstrap( defaultRootstrapID ); + } + + + public static void reinitialize() { + init = false; + rootstraps.clear(); + initialize(); + } + + + public static void setSelectedRootstrap(PlatformRootstrap selected) { + for (PlatformRootstrap r : rootstraps) { + if(r.isChecked()) { + r.setChecked(false); + } + } + selected.setChecked(true); + selectedRootstrap = selected; + } + + + public static void setSelectedRootstrap(String id) { + for(PlatformRootstrap r : RootstrapManager.getRootstraps()) { + if (id.equals(r.getId())) { + setSelectedRootstrap(r); + break; + } + } + } + + + public static void resetSelectedRootstrap() { + for (PlatformRootstrap r : rootstraps) { + if(r.isChecked()) { + r.setChecked(false); + } + } + } + + + public static PlatformRootstrap getSelectedRootstrap() { + return selectedRootstrap; + } + + + public static synchronized void addListener(IRootstrapChangedListener listener) { + changedListener.add(listener); + } + + + public static synchronized void removeListener(IRootstrapChangedListener listener) { + changedListener.remove(listener); + } + + + public static synchronized void notifyChangedRootstrap() { + + Iterator ite = changedListener.iterator(); + while (ite.hasNext()) { + IRootstrapChangedListener tl = ite.next(); + if(tl!=null) + tl.rootstrapChanged(); + } + } + + + public static synchronized void notifyChangedSelectionListener(String rootName) { + + Iterator ite = changedListener.iterator(); + while (ite.hasNext()) { + IRootstrapChangedListener tl = ite.next(); + if(tl!=null) + tl.selectionChanged(rootName); + } + } + + + private static void checkInit() { + if (!init) { + initialize(); + } + } + + + public static PlatformRootstrap generate(String name, String arch, + ArrayList reposURLs, boolean immediateGen, + IProgressMonitor monitor) throws InterruptedException { + + boolean initialized = false; + String id = name; + if ( immediateGen ) { + if ( generateBaseFileSystem(getUserRootstrapPath(id), arch, reposURLs, monitor) ) { + initialized = true; + } + else { + return null; + } + } + + // generate SBI plugins + if ( generateSBIPluginXML(id, name, arch, null, reposURLs) ) { + return new PlatformRootstrap(id, name, arch, getUserRootstrapPath(id), + reposURLs, initialized); + } + else { + if ( immediateGen ) { + removeBaseFileSystem(id, arch); + } + return null; + } + + } + + + public static boolean generateBaseFileSystem(String rootstrapPath, String arch, + ArrayList reposURLs, IProgressMonitor monitor) throws InterruptedException { + + String id = new File(rootstrapPath).getName(); + String tempDirPath = null; + try { + // make temp directory + tempDirPath = makeTempDirectory(); + + // use rogen + String rogen = InstallPathConfig.getSDKPath()+"/tools/rogen/bin/rogen.rb"; + String baseArch = getBaseArchitecture(arch); + String urlData = ""; + for( String url: reposURLs ) { + urlData += (urlData.isEmpty() ? url : "," + url ); + } + + String command; + Map env = null; + if ( PreferencesManager.isProxyUsed() ) { + String protocol = PreferencesManager.getProxyProtocol(); + String host = PreferencesManager.getProxyHost(); + int port = PreferencesManager.getProxyPort(); + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + String envKey = String.format("%s_proxy", protocol); + String envValue = String.format("%s://%s:%d", protocol, host, port); + env = sbi.addEnvironmentVariable(envKey, envValue); + } + + command = String.format( "%s -n %s -a %s -u %s -p rpm --ctrl GBS -g TizenPlatform", + rogen, id, baseArch, urlData ); + + if ( !CommandLauncher.executeSudo( command, tempDirPath, env, "Platform Internal", monitor) ) { + return false; + } + + // copy + String rootstrapBasePath = new File(rootstrapPath).getParent(); + CommandLauncher.execute(String.format("mkdir -p %s", rootstrapBasePath)); + CommandLauncher.executeSudo(String.format("sudo -S mv %s/%s %s/", tempDirPath, id, rootstrapBasePath)); + } + finally { + if ( new File(tempDirPath).exists() ) { + // check sub-directory + String checkDir = String.format("%s/%s/local/scratch.%s.0/proc", tempDirPath, id, arch ); + if ( new File(checkDir).exists() ) { + CommandLauncher.executeSudo(String.format("sudo -S umount %s", checkDir)); + } + checkDir = String.format("%s/%s/local/scratch.%s.0/dev/pts", tempDirPath, id, arch ); + if ( new File(checkDir).exists() ) { + CommandLauncher.executeSudo(String.format("sudo -S umount %s", checkDir)); + } + + // remove + CommandLauncher.executeSudo(String.format("sudo -S rm -rf %s", tempDirPath)); + } + } + + return true; + } + + + private static void removeBaseFileSystem( String id, String arch ) throws InterruptedException { + String path = getUserRootstrapPath( id ); + // check sub-directory + String checkDir = String.format("%s/local/scratch.%s.0/proc", path, arch ); + if ( new File(checkDir).exists() ) { + CommandLauncher.executeSudo(String.format("sudo -S umount %s", checkDir)); + } + checkDir = String.format("%s/local/scratch.%s.0/dev/pts", path, arch ); + if ( new File(checkDir).exists() ) { + CommandLauncher.executeSudo(String.format("sudo -S umount %s", checkDir)); + } + + CommandLauncher.executeSudo( String.format("sudo -S rm -rf %s", path), null ); + } + + public static String getBaseArchitecture( String arch ) { + if ( arch.contains("arm") ) { + return "arm"; + } + else { + return "i386"; + } + } + + public static boolean generateSBIPluginXML( String id, String name, String arch, String path, ArrayList reposURLs) { + + IPath pluginPath = new Path(SmartBuildInterface.getInstance().getPluginPath()); + IPath filePath = pluginPath.append(id + ".xml"); + + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + + // root element + Document doc = docBuilder.newDocument(); + Element rootElement = doc.createElement("extension"); + doc.appendChild(rootElement); + + Attr attr = doc.createAttribute("point"); + attr.setValue("rootstrapDefinition"); + rootElement.setAttributeNode(attr); + + Element firstnode = doc.createElement("rootstrap"); + rootElement.appendChild(firstnode); + + Attr attrId = doc.createAttribute("id"); + attrId.setValue(id); + Attr attrName = doc.createAttribute("name"); + attrName.setValue(name); + Attr attrArch = doc.createAttribute("architecture"); + attrArch.setValue(arch); + Attr attrPath = doc.createAttribute("path"); + if (path == null) { + attrPath.setValue( getUserRootstrapPathOfXml(name) ); + } else { + attrPath.setValue( getRootstrapPathOfXml(path) ); + } + Attr attrType = doc.createAttribute("supportToolchainType"); + attrType.setValue("tizen.obs"); + + firstnode.setAttributeNode(attrId); + firstnode.setAttributeNode(attrName); + firstnode.setAttributeNode(attrArch); + firstnode.setAttributeNode(attrPath); + firstnode.setAttributeNode(attrType); + + String reposURLString = ""; + for ( String URL: reposURLs ) { + if ( !reposURLString.isEmpty() ) { + reposURLString += URL_SEP; + } + reposURLString += URL; + } + + Element secondnode = doc.createElement("property"); + firstnode.appendChild(secondnode); + + Attr attrKey = doc.createAttribute("key"); + attrKey.setValue("REPOSITORY_URLS"); + Attr attrValue = doc.createAttribute("value"); + attrValue.setValue(reposURLString); + + secondnode.setAttributeNode(attrKey); + secondnode.setAttributeNode(attrValue); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + + + DOMSource source = new DOMSource(doc); + StreamResult result = new StreamResult(new FileOutputStream(new File(filePath.toOSString()))); + + transformer.transform(source, result); + + } catch (ParserConfigurationException e) { + e.printStackTrace(); + return false; + } catch (TransformerConfigurationException e) { + e.printStackTrace(); + return false; + } catch (FileNotFoundException e) { + e.printStackTrace(); + return false; + } catch (TransformerException e) { + e.printStackTrace(); + return false; + } + + return true; + } + + + public static void removeSBIPluginXML(PlatformRootstrap rootstrap) { + // remove related targets + ArrayList targetList = SBIModel.getTargetList(); + ArrayList removeList = new ArrayList(); + for( Target target : targetList ) { + if ( target.getRootstrap().getId().equals(rootstrap.getId()) ) { + removeList.add(target); + } + } + for( Target target : removeList ) { + SBIModel.removeTarget( target ); + new File(getPluginXML(target.getId())).delete(); + } + + // remove model/file + new File(getPluginXML(rootstrap.getId())).delete(); + } + + + private static PlatformRootstrap createRootstrapFromSBIPlugin( String id ) { + Rootstrap rootstrap = SBIModel.getRootstrapById(id); + if ( rootstrap == null ) { + return null; + } + + ArrayList reposURLs = new ArrayList(); + String urlStr = rootstrap.getPropertyValue("REPOSITORY_URLS"); + if ( urlStr != null ) { + for( String url : urlStr.split(URL_SEP_REGEXP) ) { + reposURLs.add(url); + } + } + + return new PlatformRootstrap(id, rootstrap.getName(), rootstrap.getArch(), + rootstrap.getPath().toOSString(), + reposURLs, true); + } + + + private static String getPluginXML( String id ) { + IPath pluginPath = new Path(SmartBuildInterface.getInstance().getPluginPath()); + return pluginPath.append(id + ".xml").toOSString(); + } + + + private static String getBaseUserRootstrapPath() { + return new Path(InstallPathConfig.getUserDataPath()) + .append(USER_ROOSTRAP_BASE_DIR_NAME).toOSString(); + } + + + private static String getUserRootstrapPath(String id) { + return new Path(getBaseUserRootstrapPath()).append(id).toOSString(); + } + + + private static String getUserRootstrapPathOfXml(String id ) { + String rootstrapPath = getUserRootstrapPath(id); + + return getRootstrapPathOfXml(rootstrapPath); + } + + + private static String getRootstrapPathOfXml( String path ) { + return path.replaceAll(String.format("%s/",InstallPathConfig.getSDKPath()), "#{SBI_HOME}/../../"). + replaceAll(String.format("%s/",InstallPathConfig.getUserDataPath()), "#{HOME}/tizen-sdk-data/"); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/SnapshotURLParser.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/SnapshotURLParser.java new file mode 100644 index 0000000..589f82f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/rootstrap/SnapshotURLParser.java @@ -0,0 +1,178 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.rootstrap; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; + +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.nativeplatform.views.model.Architecture; +import org.tizen.nativeplatform.views.model.ICheckTreeItem; +import org.tizen.nativeplatform.views.model.Snapshot; + +public class SnapshotURLParser { + public SnapshotURLParser() { + + } + + public ArrayList parse(String url) + throws MalformedURLException, IOException { + + if (url.endsWith("/")) { + url = url.substring(0, url.length() - 1); + } + + String repoPath = url + "/repos"; + boolean startBody = false; + + ArrayList archs = new ArrayList(); + + URL u = new URL(repoPath); + URLConnection yc; + Proxy p = PreferencesManager.getProxy(); + if (p == null) { + yc = u.openConnection(); + } else { + yc = u.openConnection(p); + } + + BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); + + String str; + while ((str = in.readLine()) != null) { + str = str.trim(); + if (startBody) { + if (str.startsWith("]*)?(\\s)*(/)?>", "").trim(); + item = item.split("/")[0]; + + parseArch(repoPath, item, archs, p); + continue; + } + } + if (!startBody && str.startsWith("
")) { + startBody = false; + break; + } + } + + return archs; + } + + + public ArrayList parseArch(String path, String name, + ArrayList archs, Proxy p) + throws MalformedURLException, IOException { + String repoPath = path + "/" + name; + boolean startBody = false; + + URL u = new URL(repoPath); + URLConnection yc; + if (p == null) { + yc = u.openConnection(); + } else { + yc = u.openConnection(p); + } + BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); + String str; + while ((str = in.readLine()) != null) { + str = str.trim(); + if (startBody) { + if (str.startsWith("]*)?(\\s)*(/)?>", "").trim(); + item = item.split("/")[0]; + String packagePath = repoPath + "/" + item + "/" + "packages"; + if (checkValidPath(packagePath, p)) { + Snapshot s = new Snapshot(packagePath); + boolean exists = false; + for (ICheckTreeItem arch : archs) { + if (arch.getText().equals(item)) { + arch.getChildren().add(s); + exists = true; + break; + } + } + + if (!exists) { + Architecture a = new Architecture(item); + a.getChildren().add(s); + archs.add(a); + } + } + + continue; + } + } + if (!startBody && str.startsWith("
")) { + startBody = false; + break; + } + } + + + return archs; + } + + + public boolean checkValidPath(String path, Proxy p) { + try { + URL u = new URL(path); + URLConnection yc; + + if (p == null) { + yc = u.openConnection(); + } else { + yc = u.openConnection(p); + } + // For exception + new BufferedReader(new InputStreamReader(yc.getInputStream())); + } catch (MalformedURLException e) { + return false; + } catch (IOException e) { + return false; + } + + return true; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/TizenTemplateProcess.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/TizenTemplateProcess.java new file mode 100644 index 0000000..b0da531 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/TizenTemplateProcess.java @@ -0,0 +1,111 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.templateengine; + +import java.util.ArrayList; +import java.util.List; +import org.eclipse.cdt.core.templateengine.TemplateCore; +import org.eclipse.cdt.core.templateengine.TemplateDescriptor; +import org.eclipse.cdt.core.templateengine.process.Process; +import org.eclipse.cdt.core.templateengine.process.ProcessArgument; +import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; +import org.eclipse.cdt.core.templateengine.process.ProcessRunner; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; + +import org.tizen.nativeappcommon.templateengine.TizenTemplateProcessParser; +import org.tizen.nativeappcommon.wizards.TemplateTizenNewWizard; + +import org.w3c.dom.Element; + + +public class TizenTemplateProcess extends ProcessRunner{ + public static final String MANIFEST_APP_ID = "manifestAppId"; + + @Override + public void process(TemplateCore template, ProcessArgument[] args, + String processId, IProgressMonitor monitor) + throws ProcessFailureException { + // TODO Auto-generated method stub + List processes = new ArrayList(); + + String id = null; + List processElement = null; + IPath samplePath = TizenTemplateProcessParser.getSelectedSampleLocationFromMainPage(TemplateTizenNewWizard.DIR_CPP); + + // just return if project is git project + if (samplePath == null) { + return; + } + + TemplateDescriptor desc = TizenTemplateProcessParser.createTemplateDesc(samplePath.toFile()); + + Element root = desc.getRootElement(); + processElement = TizenTemplateProcessParser.getElementsFromTag(root, TizenTemplateProcessParser.TAG_PROCESS); + + int i = 0; + for(Element element: processElement) { + id = "No Condition" + "--> Process " + (i+1) + " (" + element.getAttribute(TizenTemplateProcessParser.TAG_TYPE) + ")"; + processes.add(new Process(template, element, id)); + i++; + } + + // Pre-process for C++ specifics + /* + Map valueStore = template.getValueStore(); + // location=D:\works\runtime-EclipseApplication + // baseNameUpper=FORM3 + // baseName=form3 + // projectType=org.tizen.nativecpp.buildArtefactType.app + // baseNameLower=form3 + // projectName=form3 + // So, add $(manifestAppId) and set to generated appId for manifest.xml + String appId = "93bt1p123e"; + try { + IXMLStore xmlStore = (IXMLStore)PluginUtil.loadClass(IXMLStore.EXSD_STORE_EXTENSION_POINT_ID, IXMLStore.EXSD_APP_XML_STORE_CLASS_ID); + appId = xmlStore.generateAppId(); + } catch (CoreException e) { + Logger.error("Problem occurred while generating application id", e); + } + valueStore.put(MANIFEST_APP_ID, appId); + */ + + List statuses = new ArrayList(processes.size()); + for(Process process : processes) { + try { + statuses.add(process.process(monitor)); + } catch (ProcessFailureException e) { + throw new ProcessFailureException(e.getMessage(), e, statuses); + } + } + + //makePackageModel(projName, projType); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/process/SetDefaultBuildOptions.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/process/SetDefaultBuildOptions.java new file mode 100644 index 0000000..ddda2e2 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/templateengine/process/SetDefaultBuildOptions.java @@ -0,0 +1,94 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.templateengine.process; + +import java.util.ArrayList; + +import org.eclipse.cdt.core.templateengine.TemplateCore; +import org.eclipse.cdt.core.templateengine.process.ProcessArgument; +import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; +import org.eclipse.cdt.core.templateengine.process.ProcessRunner; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.QualifiedName; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; + +public class SetDefaultBuildOptions extends ProcessRunner { + int i = 0; + ProcessArgument[][] optionArray; + public static QualifiedName DEFAULTFRAMEWORK_KEY = new QualifiedName("RegistDefaultFw", "RegistDefaultFw"); + boolean alreadyRegist = false; + + @Override + public void process(TemplateCore template, ProcessArgument[] args, + String processId, IProgressMonitor monitor) + throws ProcessFailureException { + + String value = ""; + // project name + String projectName = args[0].getSimpleValue(); + + try { + IProject projectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); + value = projectHandle.getPersistentProperty(DEFAULTFRAMEWORK_KEY); + + if (value == null) { + projectHandle.setPersistentProperty(DEFAULTFRAMEWORK_KEY, "true"); + } else if (value.equals("true")) { + return; + } + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + IProject projectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); + + // frameworks + ProcessArgument optionList = args[1]; + optionArray = optionList.getComplexArrayValue(); + + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo( projectHandle ) ; + IConfiguration defaultConfig = info.getDefaultConfiguration(); + + ArrayList options = new ArrayList(); + for( ProcessArgument[] op: optionArray ) { + options.add( op[0].getSimpleValue() ); + } + + for( IConfiguration config: defaultConfig.getManagedProject().getConfigurations() ) { + PlatformConfigurationManager.setGBSOptions(config, options); + } + // Apply to project file + ManagedBuildManager.saveBuildInfo(projectHandle, true); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/util/CommandLauncher.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/util/CommandLauncher.java new file mode 100644 index 0000000..10e36f5 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/util/CommandLauncher.java @@ -0,0 +1,437 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.util; + +import static org.tizen.common.util.IOUtil.tryClose; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Field; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.tizen.common.ui.view.console.ConsoleManager; +import org.tizen.common.util.HostUtil; +import org.tizen.nativeplatform.password.SudoPasswdManager; + +public class CommandLauncher { + public static final String LINE_SEPARATOR = System.getProperty("line.separator"); //$NON-NLS-1$ + + public static boolean executeSudo(String command ) throws InterruptedException { + return executeSudo( command, null, null, null ); + } + + + public static boolean executeSudo(String command, String workingDir ) throws InterruptedException { + return executeSudo( command, workingDir, null, null ); + } + + + public static boolean executeSudo(String command, String workingDir, + String consoleViewName, IProgressMonitor monitor ) throws InterruptedException { + + return executeSudo(command, workingDir, null, consoleViewName, monitor); + } + + public static boolean executeSudo(String command, String workingDir, Map newEnv, + String consoleViewName, IProgressMonitor monitor ) throws InterruptedException { + + // generate script + String scriptCmd = genSudoExecuteScript(command); + if ( scriptCmd == null ) { + throw new InterruptedException("Generating execution script failed!"); + } + + return execute(scriptCmd, workingDir, newEnv, consoleViewName, monitor ); + } + + + public static boolean execute(String command) throws InterruptedException { + return execute( command, null, null, null); + } + + public static boolean execute(String command, String workingDir, + String consoleViewName, IProgressMonitor monitor ) throws InterruptedException { + return execute( command, workingDir, null, consoleViewName, monitor); + } + + + public static boolean execute(String command, String workingDir, Map newEnv, + String consoleViewName, IProgressMonitor monitor ) throws InterruptedException { + + // start process + Process proc = createProcess( command, workingDir, newEnv, false ); + + // create monitor process + ProcessMonitorThread monitorThread = null; + if ( monitor != null ) { + monitorThread = new ProcessMonitorThread(proc, monitor); + monitorThread.start(); + } + + // handle console + if( consoleViewName != null ) { + ConsoleManager cm = new ConsoleManager( consoleViewName, true ); + cm.clear(); + BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream())); + String line = null; + try { + while((line=input.readLine())!=null){ + cm.println(line); + } + } catch (IOException e) { + // do nothing + e.printStackTrace(); + } + finally{ + if ( input != null ) tryClose( input ); + } + } + + // wait for process finish + proc.waitFor(); + + // wait for monitor thread finish + if ( monitor != null ) { + monitorThread.join(); + if ( monitor.isCanceled() ) { + throw new InterruptedException("Command execution is canceled!"); + } + } + + // abnormal termination + if (proc.exitValue() != 0) { + return false; + } + else { + return true; + } + } + + + public static Process createProcess(String command, String workingDir, + boolean includeStdErr ) throws InterruptedException { + // start process + return createProcess(command, workingDir, null, includeStdErr); + } + + public static Process createProcess(String command, String workingDir, + Map newEnv, boolean includeStdErr ) throws InterruptedException { + // start process + String[] fullCommand = HostUtil.getCommand(command); + ProcessBuilder pb = new ProcessBuilder(); + pb.redirectErrorStream(includeStdErr); + pb.command(fullCommand); + if (newEnv != null) { + pb.environment().clear(); + pb.environment().putAll(newEnv); + } + if(workingDir != null) { + pb.directory(new File(workingDir)); + } + Process proc; + try { + proc = pb.start(); + } catch (IOException e) { + throw new InterruptedException(String.format("Creating process failed! : %s => %s", command, e.getMessage())); + } + + return proc; + } + + + public static String executeSudoOutput(String command ) throws InterruptedException { + return executeSudoOutput( command, null, false, null ); + } + + + public static String executeSudoOutput(String command, String workingDir, + boolean includeStdErr ) throws InterruptedException { + return executeSudoOutput( command, workingDir, includeStdErr, null ); + } + + + public static String executeSudoOutput(String command, String workingDir, + boolean includeStdErr, IProgressMonitor monitor ) throws InterruptedException { + + // generate script + String scriptCmd = genSudoExecuteScript(command); + if ( scriptCmd == null ) { + throw new InterruptedException("Generating execution script failed!"); + } + + return executeOutput(scriptCmd, workingDir, includeStdErr, monitor ); + } + + + public static String executeOutput(String command ) throws InterruptedException { + return executeOutput(command, null, false, null ); + } + + + public static String executeOutput(String command, String workingDir, + boolean includeStdErr, IProgressMonitor monitor) throws InterruptedException { + + // start process + Process proc = null; + BufferedReader input = null; + StringBuilder contents = null; + try { + proc = createProcess( command, workingDir, includeStdErr ); + + // create monitor process + ProcessMonitorThread monitorThread = null; + if ( monitor != null ) { + monitorThread = new ProcessMonitorThread(proc, monitor); + monitorThread.start(); + } + + contents = new StringBuilder(); + input = new BufferedReader(new InputStreamReader(proc.getInputStream())); + String line = null; + while((line=input.readLine())!=null){ + contents.append(line); + contents.append(LINE_SEPARATOR); + } + + // wait for process finish + proc.waitFor(); + + // wait for monitor thread finish + if ( monitor != null ) { + monitorThread.join(); + if ( monitor.isCanceled() ) { + throw new InterruptedException("Command execution is canceled!"); + } + } + } catch (IOException e) { + throw new InterruptedException("Reading process standard output failed!"); + } + finally{ + if ( input != null ) tryClose( input ); + } + + return contents.toString().trim(); + } + + + // return generate script and return script path + private static String genSudoExecuteScript(String command) { + String passwd = SudoPasswdManager.getSudoPassword(); + File shellScript = null; + + try { + // create expect script file + File expectScript = new File("/tmp/run_sudo.exp"); + expectScript.createNewFile(); + BufferedWriter bw = new BufferedWriter(new FileWriter(expectScript)); + bw.write("#!/usr/bin/expect --");bw.newLine(); + bw.write(String.format("spawn sh -c \"%s;echo \\$? > /tmp/exit-status\"",command));bw.newLine(); + bw.write("while (1) {");bw.newLine(); + bw.write(" expect {");bw.newLine(); + bw.write(" \"password for\" {");bw.newLine(); + bw.write(String.format("send \"%s\\r\"", passwd));bw.newLine(); + bw.write(" }");bw.newLine(); + bw.write(" eof {");bw.newLine(); + bw.write(" return");bw.newLine(); + bw.write(" }");bw.newLine(); + bw.write(" }");bw.newLine(); + bw.write("}");bw.newLine(); + bw.close(); + expectScript.setExecutable(true); + + shellScript = new File("/tmp/run_sudo.sh"); + shellScript.createNewFile(); + bw = new BufferedWriter(new FileWriter(shellScript)); + bw.write("#!/bin/sh -ee");bw.newLine(); + bw.write("/tmp/run_sudo.exp");bw.newLine(); + bw.write("EXIT_CODE=`cat /tmp/exit-status`");bw.newLine(); + bw.write("if [ \"$EXIT_CODE\" != \"0\" ]; then");bw.newLine(); + bw.write(" echo \"EXIT CODE=${EXIT_CODE}\" >&2");bw.newLine(); + bw.write(" exit 1");bw.newLine(); + bw.write("fi");bw.newLine(); + bw.close(); + shellScript.setExecutable(true); + } + catch (IOException e ) { + return null; + } + + // execute script + return shellScript.getPath(); + } + + + // return generate script and return script path + private static String genSudoKillProcessScript(Process process) { + String passwd = SudoPasswdManager.getSudoPassword(); + File shellScript = null; + + try { + // get process id + Field f = process.getClass().getDeclaredField("pid"); + f.setAccessible(true); + String pid = f.get(process).toString(); + + // create killtree script file + File killScript = new File("/tmp/killtree.sh"); + killScript.createNewFile(); + BufferedWriter bw = new BufferedWriter(new FileWriter(killScript)); + bw.write("#!/bin/sh");bw.newLine(); + bw.write("killtree() {");bw.newLine(); + bw.write(" local _pid=$1");bw.newLine(); + bw.write(" sudo kill -STOP ${_pid}");bw.newLine(); + bw.write(" for _child in $(ps -o pid --no-headers --ppid ${_pid}); do");bw.newLine(); + bw.write(" killtree ${_child}");bw.newLine(); + bw.write(" done");bw.newLine(); + bw.write(" sudo kill -KILL ${_pid}");bw.newLine(); + bw.write("}");bw.newLine(); + bw.write("killtree $1");bw.newLine(); + bw.close(); + killScript.setExecutable(true); + + // create expect script file + File expectScript = new File("/tmp/run_sudo2.exp"); + expectScript.createNewFile(); + bw = new BufferedWriter(new FileWriter(expectScript)); + bw.write("#!/usr/bin/expect --");bw.newLine(); + bw.write(String.format("spawn sh -c \"/tmp/killtree.sh %s\"",pid ));bw.newLine(); + bw.write("while (1) {");bw.newLine(); + bw.write(" expect {");bw.newLine(); + bw.write(" \"password for\" {");bw.newLine(); + bw.write(String.format("send \"%s\\r\"", passwd));bw.newLine(); + bw.write(" }");bw.newLine(); + bw.write(" eof {");bw.newLine(); + bw.write(" return");bw.newLine(); + bw.write(" }");bw.newLine(); + bw.write(" }");bw.newLine(); + bw.write("}");bw.newLine(); + bw.close(); + expectScript.setExecutable(true); + + shellScript = new File("/tmp/run_sudo2.sh"); + shellScript.createNewFile(); + bw = new BufferedWriter(new FileWriter(shellScript)); + bw.write("#!/bin/sh -ee");bw.newLine(); + bw.write("/tmp/run_sudo2.exp");bw.newLine(); + bw.close(); + shellScript.setExecutable(true); + + return shellScript.getPath(); + } catch (SecurityException e) { + return null; + } catch (NoSuchFieldException e) { + return null; + } catch (IllegalArgumentException e) { + return null; + } catch (IllegalAccessException e) { + return null; + } catch (IOException e ) { + return null; + } + } + + // generate interrupt script for platform debugging and return script path + public static String genDebugginInterruptScript(Process process) { + String passwd = SudoPasswdManager.getSudoPassword(); + + try { + // get process id + Field f = process.getClass().getDeclaredField("pid"); + f.setAccessible(true); + String pid = f.get(process).toString(); + + // create interrupt script file + File interruptScript = new File("/tmp/interruptProc.sh"); + interruptScript.createNewFile(); + BufferedWriter bw = new BufferedWriter(new FileWriter(interruptScript)); + bw.write("#!/bin/sh");bw.newLine(); + bw.write("proctree() {");bw.newLine(); + bw.write(" local _pid=$1");bw.newLine(); + bw.write(" for _child in $(ps -o pid --no-headers --ppid ${_pid}); do");bw.newLine(); + bw.write(" proctree ${_child}");bw.newLine(); + bw.write(" done");bw.newLine(); + bw.write(" user=`ps -o user --no-headers --pid ${_pid}`");bw.newLine(); + bw.write(" if [ \"x${user}\" = \"xroot\" ]; then");bw.newLine(); + bw.write(String.format(" echo \"%s\" | sudo -S kill -SIGINT ${_pid}", passwd));bw.newLine(); + bw.write(" exit 0");bw.newLine(); + bw.write(" fi");bw.newLine(); + bw.write("}");bw.newLine(); + bw.write(String.format("proctree %s", pid));bw.newLine(); + bw.write("exit -1");bw.newLine(); + bw.close(); + interruptScript.setExecutable(true); + + return interruptScript.getPath(); + } catch (SecurityException e) { + return null; + } catch (NoSuchFieldException e) { + return null; + } catch (IllegalArgumentException e) { + return null; + } catch (IllegalAccessException e) { + return null; + } catch (IOException e ) { + return null; + } + } + + + static class ProcessMonitorThread extends Thread { + private Process process; + private IProgressMonitor monitor; + public ProcessMonitorThread(Process process, IProgressMonitor monitor) { + this.process = process; + this.monitor = monitor; + } + + + public void run() { + boolean sendSignal = false; + while( true ) { + try { + Thread.sleep(1000); // wait 1 sec + if ( !sendSignal && monitor.isCanceled() ) { + String killCmd = genSudoKillProcessScript( process ); + Process killProcess = createProcess( killCmd, null, false ); + killProcess.waitFor(); + sendSignal = true; + } + break; + } + catch(InterruptedException e) { + continue; + } + } + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Architecture.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Architecture.java new file mode 100644 index 0000000..202f25b --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Architecture.java @@ -0,0 +1,86 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.model; + +import java.util.ArrayList; + +public class Architecture implements ICheckTreeItem { + private String name; + private ArrayList repos = new ArrayList(); + private boolean checked; + + public Architecture(String name) { + this.name = name; + } + + public Architecture(String name, ArrayList repos) { + this.name = name; + this.repos = repos; + } + + public String getName() { + return name; + } + + public void setSnapshots(ArrayList s) { + this.repos = s; + } + + public ArrayList getChildren() { + return repos; + } + + public boolean hasChildren() { + return !repos.isEmpty(); + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean isChecked) { + checked = isChecked; + if (hasChildren()) { + for (ICheckTreeItem item : getChildren()) { + item.setChecked(isChecked); + } + } + } + + @Override + public boolean isGrayed() { + // TODO Auto-generated method stub + return false; + } + + @Override + public String getText() { + return name; + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/ICheckTreeItem.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/ICheckTreeItem.java new file mode 100644 index 0000000..32217a9 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/ICheckTreeItem.java @@ -0,0 +1,40 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.model; + +import java.util.ArrayList; + +public interface ICheckTreeItem { + public boolean isChecked(); + public boolean isGrayed(); + public String getText(); + public void setChecked(boolean isChecked); + public ArrayList getChildren(); + public boolean hasChildren(); + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/PlatformRootstrap.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/PlatformRootstrap.java new file mode 100644 index 0000000..9ece06a --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/PlatformRootstrap.java @@ -0,0 +1,115 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.model; + +import java.util.ArrayList; +import org.eclipse.core.runtime.Path; +import org.tizen.nativecommon.build.model.Rootstrap; + +public class PlatformRootstrap extends Rootstrap implements ICheckTreeItem { + private String http_proxy; + private boolean checked; + private boolean initialized; + private ArrayList reposURLs; + public static final String SUPPORTED_TOOLCHAIN_TYPE = "tizen.obs"; + public static final String DEFAULT_ROOTSTRAP_ARM_ID = "tizen-device-2.0.platform"; + public static final String DEFAULT_ROOTSTRAP_I386_ID = "tizen-emulator-2.0.platform"; + private static final String VERSION = "1.0"; + + public PlatformRootstrap(String id, String name, String arch, String rootstrapPath, + ArrayList reposURLs, boolean initialized) { + super(id, name, SUPPORTED_TOOLCHAIN_TYPE, VERSION, arch, new Path(rootstrapPath)); + this.reposURLs = reposURLs; + this.initialized = initialized; + } + + + public String getText() { + return name; + } + + public String getProxy() { + return http_proxy; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean isChecked) { + checked = isChecked; + } + + public void setInitialized(boolean isInitialized) { + this.initialized = isInitialized; + } + + public boolean isInitialized() { + return initialized; + } + + public ArrayList getRepositoryURLs() { + return reposURLs; + } + + public void addRepositoryURL( String url ) { + reposURLs.add( url ); + } + + public void changeRepositoryURL( String fromURL, String toURL ) { + for( int i = 0; i < reposURLs.size(); i++ ) { + String url = reposURLs.get(i); + if ( url.equals(fromURL) ) { + reposURLs.set(i, toURL); + return; + } + } + return; + } + + + public void removeRepositoryURL( String url ) { + reposURLs.remove(url); + } + + + @Override + public boolean isGrayed() { + return false; + } + + @Override + public ArrayList getChildren() { + return null; + } + + @Override + public boolean hasChildren() { + return false; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Snapshot.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Snapshot.java new file mode 100644 index 0000000..b77168a --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/model/Snapshot.java @@ -0,0 +1,73 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.model; + +import java.util.ArrayList; + +import org.tizen.nativeplatform.views.model.ICheckTreeItem; + +public class Snapshot implements ICheckTreeItem { + private String url; + private boolean checked; + + public Snapshot(String url) { + this.url = url; + } + + public String getAddr() { + return url.toString(); + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean isChecked) { + checked = isChecked; + } + + @Override + public boolean isGrayed() { + return false; + } + + @Override + public String getText() { + return url; + } + + @Override + public ArrayList getChildren() { + return null; + } + + @Override + public boolean hasChildren() { + return false; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapContentProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapContentProvider.java new file mode 100644 index 0000000..ca4f4b5 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapContentProvider.java @@ -0,0 +1,61 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.provider; + +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.tizen.nativeplatform.views.model.ICheckTreeItem; + + +public class RootstrapContentProvider extends ArrayContentProvider implements ITreeContentProvider { + + @Override + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof ICheckTreeItem) { + ICheckTreeItem parent = (ICheckTreeItem) parentElement; + return parent.getChildren().toArray(); + } else { + return null; + } + } + + @Override + public Object getParent(Object element) { + return null; + } + + @Override + public boolean hasChildren(Object element) { + if (element instanceof ICheckTreeItem) { + ICheckTreeItem item = (ICheckTreeItem) element; + return item.hasChildren(); + } else { + return false; + } + } +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapLabelProvider.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapLabelProvider.java new file mode 100644 index 0000000..cf4a52c --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/provider/RootstrapLabelProvider.java @@ -0,0 +1,51 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.provider; + +import org.eclipse.jface.viewers.LabelProvider; + +import org.tizen.nativeplatform.views.model.ICheckTreeItem; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; + + +public class RootstrapLabelProvider extends LabelProvider { + public String getText(Object element) { + if (element instanceof PlatformRootstrap) { + PlatformRootstrap item = (PlatformRootstrap) element; + return "[" + item.getArch() + "] " + item.getText(); + + } + if (element instanceof ICheckTreeItem) { + ICheckTreeItem item = (ICheckTreeItem) element; + return item.getText(); + } else { + return null; + } + } + +} \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/AddRootstrapDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/AddRootstrapDialog.java new file mode 100644 index 0000000..ae4ad84 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/AddRootstrapDialog.java @@ -0,0 +1,426 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.ui; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.tizen.common.util.DialogUtil; +import org.tizen.common.util.SWTUtil; +import org.tizen.nativeplatform.rootstrap.SnapshotURLParser; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; +import org.tizen.nativeplatform.views.model.ICheckTreeItem; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; + +public class AddRootstrapDialog extends Dialog { + + private Text rootstrapText; + private Text snapshotUrlText; + private TableViewer reposURLViewer; + private Combo archCombo; + private Button generateImmediateBt; + + ArrayList snapshotInfos; + private PlatformRootstrap generatedRootstrap; + private String rootstrapName; + private String architecture; + private ArrayList repositoryURLs; + boolean isImmediateGenerateChecked; + + private final static int COL_REPOS_NAME = 0; + private final static int COL_REPOS_URL = 1; + + private int x = 0; + private int y = 0; + private final int width = 800; + private final int height = 550; + private Shell shell; + + private final String BUNDLE_NAME = AddRootstrapDialog.class.getPackage().getName() + ".RootstrapUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + public AddRootstrapDialog(Shell parentShell) { + super(parentShell); + this.shell = parentShell; + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("GenRootDlg.Title")); + newShell.setLocation(x, y); + newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); + composite.setLayout(new GridLayout(1, false)); + + createRootstrapNameComposite(composite); + createSelectSnapshotComposite(composite); + createSettingRepoComposite(composite); + + createGenButtonComposite(composite); + return null; + } + + private void createRootstrapNameComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(2, false)); + + Label nameLabel = new Label(composite, SWT.NONE); + nameLabel.setText(resources.getString("GenRootDlg.Label.Rootstrapname")); + rootstrapText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.SEARCH); + GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.minimumHeight = 0; + rootstrapText.setLayoutData(gridData); + } + + + private void createGenButtonComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + generateImmediateBt = new Button(composite, SWT.CHECK); + generateImmediateBt.setText(resources.getString("GenRootDlg.Button.GenImmedate")); + GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING); + generateImmediateBt.setLayoutData(gridData); + } + + + private void createSelectSnapshotComposite(Composite parent) { + + Group group = new Group(parent, SWT.NONE); + group.setLayout(new GridLayout(1, false)); + group.setText(resources.getString("GenRootDlg.Group.Snapshot")); + GridData gridData = new GridData(GridData.FILL_BOTH); + group.setLayoutData(gridData); + + createSnapshotUrlComposite(group); + createArchitectureComposite(group); + } + + + private void createSettingRepoComposite(Composite parent) { + + Group group = new Group(parent, SWT.NONE); + group.setLayout(new GridLayout(1, false)); + group.setText(resources.getString("GenRootDlg.Group.Repos")); + GridData gridData = new GridData(GridData.FILL_BOTH); + group.setLayoutData(gridData); + + createTreeViewer(group); + } + + + private void createSnapshotUrlComposite(Composite parent) { + Composite snapshotComp = new Composite(parent, SWT.NONE); + snapshotComp.setLayout(new GridLayout(3, false)); + GridData gridData = new GridData(GridData.FILL_BOTH); + snapshotComp.setLayoutData(gridData); + + Label snapshotLabel = new Label(snapshotComp, SWT.NONE); + gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 100; + snapshotLabel.setLayoutData(gridData); + snapshotLabel.setAlignment(SWT.RIGHT); + snapshotLabel.setText(resources.getString("GenRootDlg.Label.SnapshotURL")); + + snapshotUrlText = new Text(snapshotComp, SWT.SINGLE | SWT.BORDER); + gridData = new GridData(GridData.FILL_HORIZONTAL); + snapshotUrlText.setLayoutData(gridData); + + Button searchBt = new Button(snapshotComp, SWT.PUSH); + searchBt.setText(resources.getString("GenRootDlg.Button.Search")); + + searchBt.addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + + final String snapshotUrl = snapshotUrlText.getText().trim(); + + if (snapshotUrl.isEmpty()) { + DialogUtil.openErrorDialog(resources.getString("GenRootDlg.Error.Empty.Snapshot")); + return; + } + + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + monitor.beginTask(resources.getString("GenRootDlg.Progress.Msg.Searching"), -1); + try { + final SnapshotURLParser c = new SnapshotURLParser(); + snapshotInfos = null; + snapshotInfos = c.parse(snapshotUrl); + } catch (final IOException e) { + e.printStackTrace(); + SWTUtil.getDisplay().asyncExec( new Runnable() { + @Override + public void run() { + DialogUtil.openErrorDialog( + resources.getString("GenRootDlg.Error.Snapshot.Failed")+ + "("+e.toString()+")"); + } + }); + } + } + }); + } catch (InvocationTargetException e1) { + e1.printStackTrace(); + DialogUtil.openErrorDialog(e.toString()); + return; + } catch (InterruptedException e1) { + e1.printStackTrace(); + DialogUtil.openErrorDialog(e.toString()); + return; + } + + archCombo.removeAll(); + if (snapshotInfos == null || snapshotInfos.size() == 0 ) { + UpdateRepositoryURL(); + return; + } + + // add architecture list + for ( ICheckTreeItem item: snapshotInfos ) { + archCombo.add(item.getText()); + } + archCombo.setEnabled(true); + archCombo.select(0); + + // Update repository table + UpdateRepositoryURL(); + } + + @Override + public void mouseUp(MouseEvent e) { + } + + }); + } + + + private void createArchitectureComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + GridData gridData = new GridData(GridData.FILL_BOTH); + composite.setLayoutData(gridData); + + Label archLabel = new Label(composite, SWT.NONE); + gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gridData.widthHint = 100; + archLabel.setLayoutData(gridData); + archLabel.setAlignment(SWT.RIGHT); + archLabel.setText(resources.getString("GenRootDlg.Label.Architecture")); + + archCombo = new Combo(composite, SWT.READ_ONLY); + gridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gridData.minimumHeight = 0; + archCombo.setLayoutData(gridData); + archCombo.addSelectionListener( new SelectionListener(){ + + @Override + public void widgetSelected(SelectionEvent e) { + UpdateRepositoryURL(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + }); + archCombo.setEnabled(false); + } + + + private void UpdateRepositoryURL() { + int selectIdx = archCombo.getSelectionIndex(); + // show repository URLs + ArrayList data = new ArrayList(); + if ( selectIdx >= 0 ) { + ArrayList children = snapshotInfos.get(selectIdx).getChildren(); + for ( int idx = 0; idx < children.size(); idx++ ) { + data.add(String.format("url%d|%s", idx, children.get(idx).getText() ) ); + } + } + reposURLViewer.setInput(data); + } + + + private void createTreeViewer(Composite parent) { + + reposURLViewer = new TableViewer(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + Table table = reposURLViewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + reposURLViewer.setLabelProvider(new TableViewerProvider()); + reposURLViewer.setContentProvider(new ArrayContentProvider()); + + TableColumn column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("GenRootDlg.Tree.Column.Name")); + column.setWidth(50); + + column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("GenRootDlg.Tree.Column.URL")); + column.setWidth(300); + + GridData tableGridData = new GridData(GridData.FILL_HORIZONTAL|GridData.VERTICAL_ALIGN_BEGINNING); + tableGridData.heightHint = 200; + table.setLayoutData(tableGridData); + + reposURLViewer.setInput(new ArrayList()); + } + + + @Override + protected void okPressed() { + rootstrapName = rootstrapText.getText().trim(); + if (rootstrapName.isEmpty()) { + DialogUtil.openErrorDialog(resources.getString("GenRootDlg.Error.Empty.Rootstrap")); + return; + } + if ( RootstrapManager.getRootstrap(rootstrapName ) != null ) { + DialogUtil.openErrorDialog("Rootstrap name ["+rootstrapName+"] already exists!"); + return; + } + architecture = archCombo.getText().trim(); + repositoryURLs = new ArrayList(); + for ( TableItem item: reposURLViewer.getTable().getItems() ) { + repositoryURLs.add(item.getText(COL_REPOS_URL)); + } + + if (repositoryURLs.isEmpty()) { + DialogUtil.openErrorDialog( + resources.getString("GenRootDlg.Error.NoAnyRepos")); + return; + } + + isImmediateGenerateChecked = generateImmediateBt.getSelection(); + super.okPressed(); + } + + + public PlatformRootstrap getGeneratedRootstrap() { + return generatedRootstrap; + } + + + public String getRootstrapName() { + return rootstrapName; + } + + + + public String getArchitecture() { + return architecture; + } + + + public ArrayList getRepositoryURLs() { + return repositoryURLs; + } + + public boolean isImmediateGenerateChecked() { + return isImmediateGenerateChecked; + } + + + private class TableViewerProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + @Override + public String getColumnText(Object element, int columnIndex) { + String strData = (String)element; + + switch(columnIndex) { + case COL_REPOS_NAME: + return strData.split("[|]")[COL_REPOS_NAME]; + case COL_REPOS_URL: + return strData.split("[|]")[COL_REPOS_URL]; + default: + return ""; + } + } + } + +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapUIMessages.properties new file mode 100644 index 0000000..95c8c15 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapUIMessages.properties @@ -0,0 +1,60 @@ +View.Add.Rootstrap.ToolTip = Create New Rootstrap +View.Import.Rootstrap.ToolTip = Import Rootstrap + +View.Error.Init.SBIModel = Failed to initialize SBI model + +View.Table.Column.Rootstrap = Rootstrap Name +View.Table.Column.Arch = Arch + +View.Description.Label = Description + +View.Contextmenu.Title = Rootstrap Context Menu +View.Contextmenu.Select = Select +View.Contextmenu.Manage = Manage Packages +View.Contextmenu.Remove = Remove +View.Contextmenu.Export = Export + +GenRootDlg.Title = Generate Rootstrap Dialog +GenRootDlg.Label.Rootstrapname = Rootstrap Name : + +GenRootDlg.Group.Snapshot = Snapshot +GenRootDlg.Label.SnapshotURL = Snapshot URL : +GenRootDlg.Button.Search = Search +GenRootDlg.Label.Architecture = Architecture : + +GenRootDlg.Group.Repos = Repository URL +GenRootDlg.Tree.Column.Name = Name +GenRootDlg.Tree.Column.URL = Repository URL + +GenRootDlg.Button.GenImmedate = Generate Immediately + +GenRootDlg.Progress.Msg.Generating = Generating rootstrap... +GenRootDlg.Progress.Msg.Searching = Seaching repositories +GenRootDlg.Error.Fail.Generate = Failed to generate rootstrap! +GenRootDlg.Error.Empty.Snapshot = Snapshot URL is empty +GenRootDlg.Error.Empty.Rootstrap = Rootstrap is empty +GenRootDlg.Error.Snapshot.Failed = Getting snapshot information failed!\n +GenRootDlg.Error.Gen.Rootstrap.Failed = Generating rootstrap failed!!\n +GenRootDlg.Error.NoAnyRepos = There is no any repositories! + +SelectRootDlg.Title = Warning +SelectRootDlg.Msg.LastOne = "%s [%s]" rootstrap is the last one. You can not remove it +SelectRootDlg.Label.Desc = Follow projects use "%s" rootstrap.\nYou should set other rootstraps if you want to remove "%s" rootstrap + +Action.Msg.Error.SelectRootstrap = The "%s" rootstrap can not be selected at "%s" configuration because of architecture mismatch. +Action.Msg.Error.RemoveDefault = Cannot remove basic rootstrap! +Action.Msg.Progress.Exporting = Exporting rootstrap... +Action.Msg.Error.ExportUninitialzed = Cannot export uninitialized rootstrap! +Action.Msg.Info.ExportOK = Exporting rootstrap is successful! +Action.Msg.Error.ExportFailed = Exporting rootstrap failed! +Action.Msg.Question.NotInit = This rootstrap is not initialize. Will you initialize it? +Action.Msg.Progress.Importing = Importing rootstrap... +Action.Msg.Info.ImportOK = Importing rootstrap is successful! +Action.Msg.Error.ImportFailed = Importing rootstrap failed! +Action.Msg.Progress.Initializing.PkgMgr = Initializing Package Manager... +Action.Msg.Error.InitFailed.PkgMgr = Initializing Package Manager failed! +Action.Msg.Progress.Removing = Removing rootstrap... +Action.Msg.Error.RemoveFailed = Removing rootstrap failed! + +FileDlg.Title.Export = Export rootstrap +FileDlg.Title.Import = Import rootstrap \ No newline at end of file diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapView.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapView.java new file mode 100644 index 0000000..91e298d --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/RootstrapView.java @@ -0,0 +1,965 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.ui; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.ISizeProvider; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.contexts.IContextService; +import org.eclipse.ui.part.ViewPart; +import org.tizen.common.TizenHelpContextIds; +import org.tizen.common.util.DialogUtil; +import org.tizen.common.util.ImageUtil; + +import org.tizen.nativecommon.ProjectUtil; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativecommon.build.exception.SBIException; +import org.tizen.nativeplatform.Activator; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.pkgmgr.ui.RPMPackageDialog; +import org.tizen.nativeplatform.rootstrap.IRootstrapChangedListener; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; +import org.tizen.nativeplatform.rootstrap.RootstrapManager; + +public class RootstrapView extends ViewPart { + + private ToolBar toolBar; + private TableViewer tableViewer; + private final int COL_IDX_ROOTNAME = 0; + private final int COL_IDX_ARCH = 1; + private Text rootDescText; + + private Action actionSetDefault; + private Action actionPkgMgr; + private Action actionRemove; + private Action actionExport; + private MenuManager menuMgr; + + private PlatformRootstrap generatedRootstrap; + private final int MINIMUM_VIEW_WIDTH = 300; + + private IProject project; + private Shell shell; + + private static final String PLATFORM_PERSPECTIVE_ID = "org.tizen.nativeplatform.perspective"; + + private final String BUNDLE_NAME = AddRootstrapDialog.class.getPackage().getName() + ".RootstrapUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private IRootstrapChangedListener cListener = new IRootstrapChangedListener() + { + @Override + public void rootstrapChanged() { + Display.getDefault().syncExec(new Runnable() { + + @Override + public void run() { + tableViewer.refresh(); + } + }); + } + + @Override + public void selectionChanged(String rootName) { + + } + }; + + private ICProjectDescriptionListener prjListner = new ICProjectDescriptionListener() + { + + @Override + public void handleEvent(CProjectDescriptionEvent event) + { + final String appliedConfigName = event.getAppliedCProjectDescription() + .getActiveConfiguration().getName(); + + project = event.getProject(); + if (project != null) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + IConfiguration config = info.getDefaultConfiguration(); + IManagedProject managedProject = config.getManagedProject(); + + String projectArtifactType = managedProject.getProjectType() != null ? + managedProject.getProjectType().getBuildArtefactType().getId() : null; + if ( projectArtifactType != null && + (!projectArtifactType.equals(PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE))) { + return; + } + + for (IConfiguration c : managedProject.getConfigurations()) { + if (c.getName().equals(appliedConfigName)) { + config = c; + break; + } + } + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + if (targetId == null) { + RootstrapManager.resetSelectedRootstrap(); + return; + } + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + String rootId = sbi.getRootstrapIDFromTargetID(targetId); + RootstrapManager.setSelectedRootstrap(rootId); + RootstrapManager.notifyChangedRootstrap(); + } else { + RootstrapManager.resetSelectedRootstrap(); + } + + } + }; + + private ISelectionListener listener = new ISelectionListener() + { + + @Override + public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) + { + String perspectiveID = sourcepart.getSite().getPage().getPerspective().getId(); + if (!perspectiveID.equals(PLATFORM_PERSPECTIVE_ID)) { + return; + } + + if (!("Project Explorer".equals(sourcepart.getTitle()) + || "Navigator".equals(sourcepart.getTitle()) || sourcepart instanceof IEditorPart)) { + return; + } + + project = ProjectUtil.getProject(sourcepart, selection); + + if (project != null) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + IConfiguration config = info.getDefaultConfiguration(); + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + String rootId = sbi.getRootstrapIDFromTargetID(targetId); + RootstrapManager.setSelectedRootstrap(rootId); + RootstrapManager.notifyChangedRootstrap(); + } else { + RootstrapManager.resetSelectedRootstrap(); + } + } + }; + + + @Override + public void createPartControl(Composite parent) { + + shell = this.getViewSite().getShell(); + + RootstrapManager.addListener(cListener); + CoreModel.getDefault().addCProjectDescriptionListener(prjListner, + CProjectDescriptionEvent.DATA_APPLIED); + + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().addSelectionListener(listener); + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, TizenHelpContextIds.HELP_COMMON_CONNECTION_EXPLORER_CONTEXT); + GridLayout layout = new GridLayout(1,false); + layout.marginHeight = 0; + layout.marginWidth = 0; + parent.setLayout(layout); + + createToolBar(parent); + createRootstrapTableComposite(parent); + createRootstrapDescComposite(parent); + + makeActions(); + activateContext(); + initContextMenu(); + + } + + + // This override is for change the default/minimum size of Rootstrap view + @SuppressWarnings("rawtypes") + @Override + public Object getAdapter(Class adapter) { + if (ISizeProvider.class == adapter) { + return new ISizeProvider() { + public int getSizeFlags(boolean width) { + return SWT.MIN | SWT.MAX | SWT.FILL; + } + + public int computePreferredSize(boolean width, int availableParallel, int availablePerpendicular, int preferredResult) { + return width ? MINIMUM_VIEW_WIDTH : preferredResult; + } + }; + } + return super.getAdapter(adapter); + } + + + @Override + public void setFocus() { + } + + private void createToolBar(Composite composite) + { + toolBar = new ToolBar(composite, SWT.NULL); + GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END); + toolBar.setLayoutData(gridData); + new ToolItem(toolBar, SWT.SEPARATOR); // Separator + + ToolItem addRootstrap = new ToolItem(toolBar, SWT.PUSH); + Image addIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/add.gif"); + addRootstrap.setImage(addIcon); + addRootstrap.setToolTipText(resources.getString("View.Add.Rootstrap.ToolTip")); + + addRootstrap.addSelectionListener(new SelectionListener() { + @Override + public void widgetSelected(SelectionEvent e) { + showAddDialog(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing to do + } + }); + addRootstrap.setEnabled(true); + + new ToolItem(toolBar, SWT.SEPARATOR); // Separator + + ToolItem importRootstrap = new ToolItem(toolBar, SWT.PUSH); + Image editIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/import.gif"); + importRootstrap.setImage(editIcon); + importRootstrap.setToolTipText(resources.getString("View.Import.Rootstrap.ToolTip")); + importRootstrap.addSelectionListener( new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + showImportDialog(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing to do + } + + }); + + } + + + + + private void createRootstrapTableComposite(Composite parent) { + + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout layout = new GridLayout(1,false); + layout.marginHeight = 0; + layout.marginWidth = 0; + composite.setLayout(layout); + + tableViewer = new TableViewer(composite, SWT.BORDER|SWT.V_SCROLL); + Table table = tableViewer.getTable(); + GridData tableGridData = new GridData(GridData.FILL_BOTH|GridData.VERTICAL_ALIGN_BEGINNING); + table.setLayoutData(tableGridData); + + table.setHeaderVisible(true); + table.setLinesVisible(true); + + TableColumn column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("View.Table.Column.Rootstrap")); + column.setWidth(240); + column.addSelectionListener(new TooltableSelectionAdapter()); + + column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + column.setText(resources.getString("View.Table.Column.Arch")); + column.setWidth(50); + column.addSelectionListener(new TooltableSelectionAdapter()); + + tableViewer.setLabelProvider(new TableViewerProvider()); + tableViewer.setContentProvider(new ArrayContentProvider()); + tableViewer.setInput(RootstrapManager.getRootstraps()); + + tableViewer.getTable().addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + Table table = tableViewer.getTable(); + TableItem[] item = table.getSelection(); + if ( item.length > 0 ) { + PlatformRootstrap selected = (PlatformRootstrap)item[0].getData(); + rootDescText.setText( getRootstrapDescription(selected)); + } + else { + rootDescText.setText(""); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + }); + } + + + private String getRootstrapDescription( PlatformRootstrap rootstrap ) { + String archLine = String.format("* Architecture: %s(%s)", + getArchitectureCategory(rootstrap.getArch()), + rootstrap.getArch()); + String statusLine = String.format("* Status : %s", rootstrap.isInitialized()? "OK":"Not Intialized"); + String urlLine = "* Repository URLs"; + for( String url: rootstrap.getRepositoryURLs() ) { + urlLine += String.format("\n - %s", url); + } + + return archLine + "\n" + statusLine + "\n" + urlLine; + } + + + private void createRootstrapDescComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout layout = new GridLayout(1,false); + layout.marginHeight = 0; + layout.marginWidth = 0; + composite.setLayout(layout); + + Label descriptionLabel = new Label(composite, SWT.NONE); + GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + descriptionLabel.setLayoutData(gridData); + descriptionLabel.setText(resources.getString("View.Description.Label")); + + rootDescText = new Text( composite, SWT.MULTI|SWT.READ_ONLY|SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL ); + gridData = new GridData(GridData.FILL_BOTH); + gridData.heightHint = 50; + rootDescText.setLayoutData( gridData ); + } + + + private void initContextMenu() { + // initalize the context menu + menuMgr = new MenuManager(resources.getString("View.Contextmenu.Title")); //$NON-NLS-1$ + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + @Override + public void menuAboutToShow(IMenuManager manager) { + fillContextMenu(manager); + } + }); + + Menu menu = menuMgr.createContextMenu(tableViewer.getTable()); + tableViewer.getTable().setMenu(menu); + getSite().registerContextMenu(menuMgr, tableViewer); + + menuMgr.addMenuListener(new IMenuListener() { + @Override + public void menuAboutToShow(IMenuManager manager) { + // Remove team menu from our menu + IContributionItem[] items = manager.getItems(); + if (items != null) { + for (IContributionItem item : items) { + if (("team.main").equals(item.getId())) { + manager.remove(item); + break; + } + } + } + } + }); + } + + private void fillContextMenu(IMenuManager manager) + { + manager.add(new Separator()); + manager.add(actionSetDefault); + manager.add(new Separator()); + manager.add(actionExport); + manager.add(actionRemove); + manager.add(new Separator()); + manager.add(actionPkgMgr); + } + + private void activateContext() + { + IContextService contextService = (IContextService) getSite().getService(IContextService.class); + contextService.activateContext("org.tizen.common.rootstrap.setdefault.context"); + contextService.activateContext("org.tizen.common.rootstrap.lauchpkgmgr.context"); + contextService.activateContext("org.tizen.common.rootstrap.remove.context"); + contextService.activateContext("org.tizen.common.rootstrap.export.context"); + } + + private void makeActions() + { + actionSetDefault = new Action() { + @Override + public void run() { + selectionBuildRoot(); + } + }; + actionSetDefault.setText(resources.getString("View.Contextmenu.Select")); + + actionPkgMgr = new Action() { + @Override + public void run() { + selectionPkgMgr(); + } + }; + actionPkgMgr.setText(resources.getString("View.Contextmenu.Manage")); + + actionRemove = new Action() { + @Override + public void run() { + removeRootstrap(); + } + }; + actionRemove.setText(resources.getString("View.Contextmenu.Remove")); + + actionExport = new Action() { + @Override + public void run() { + exportRootstrap(); + } + }; + actionExport.setText(resources.getString("View.Contextmenu.Export")); + } + + + private void showAddDialog() { + AddRootstrapDialog dlg = new AddRootstrapDialog(shell); + if ( dlg.open() == AddRootstrapDialog.OK ) { + final String rootstrapName = dlg.getRootstrapName(); + final String arch = dlg.getArchitecture(); + final ArrayList repositoryURLs = dlg.getRepositoryURLs(); + final boolean immediateGen = dlg.isImmediateGenerateChecked(); + + // generate rootstrap here + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + monitor.beginTask(resources.getString("GenRootDlg.Progress.Msg.Generating"), -1); + generatedRootstrap = null; + generatedRootstrap = RootstrapManager.generate(rootstrapName, arch, repositoryURLs, immediateGen, monitor); + if ( generatedRootstrap == null ) { + throw new InterruptedException(); + } + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog(String.format("%s\n * %s", + resources.getString("GenRootDlg.Error.Gen.Rootstrap.Failed"), + e.getMessage())); + return; + } catch (InterruptedException e) { + DialogUtil.openErrorDialog(String.format("%s\n * %s", + resources.getString("GenRootDlg.Error.Gen.Rootstrap.Failed"), + e.getMessage())); + return; + } + + RootstrapManager.addRootstrap( generatedRootstrap ); + } + } + + + private void showImportDialog() { + FileDialog fd = new FileDialog( shell, SWT.OPEN); + fd.setText(resources.getString("FileDlg.Title.Import")); + String[] extensions = {"*.tar"}; + fd.setFilterExtensions(extensions); + String resultFilePath = fd.open(); + generatedRootstrap = null; + if (resultFilePath != null) { + if ( !resultFilePath.endsWith(".tar")) { + resultFilePath += ".tar"; + } + final String selectedFilePath = resultFilePath; + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("Action.Msg.Progress.Importing"), -1); + generatedRootstrap = RootstrapManager.importRootstrap( selectedFilePath, monitor ); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( + String.format("%s\n * %s", resources.getString("Action.Msg.Error.ImportFailed"), + e.getMessage() ) ); + return; + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( + String.format("%s\n * %s", resources.getString("Action.Msg.Error.ImportFailed"), + e.getMessage() ) ); + return; + } + } + + if (generatedRootstrap == null) { + return; + } + RootstrapManager.addRootstrap( generatedRootstrap ); + DialogUtil.openMessageDialog(shell,resources.getString("Action.Msg.Info.ImportOK")); + } + + + public void selectionBuildRoot() + { + doActionForEntry(new IActionForEntry() + { + @Override + public void doAction() + { + Table table = tableViewer.getTable(); + TableItem[] item = table.getSelection(); + PlatformRootstrap selected = (PlatformRootstrap)item[0].getData(); + if (project != null) { + if (!verifyActiveRootstrap( project, selected)) { + showErrorSelectRootstrap(project, selected); + return; + } + setActiveRootstrap( project, selected ); + } + } + + @Override + public boolean doCheckEnable() + { + return true; + } + }); + } + + private void showErrorSelectRootstrap(IProject project, PlatformRootstrap rootstrap) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + IConfiguration config = info.getDefaultConfiguration(); + String message = String.format(resources.getString("Action.Msg.Error.SelectRootstrap"), + rootstrap.getId(), config.getName()); + DialogUtil.openErrorDialog(message); + } + + + private void setActiveRootstrap(IProject project, PlatformRootstrap rootstrap ) { + String rootId = rootstrap.getId(); + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + IConfiguration config = info.getDefaultConfiguration(); + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + String toolId = sbi.getToolchainIDFromTargetID(targetId); + String newTargetId = SmartBuildInterface.makeTargetID(rootId, toolId); + try { + if (!sbi.checkTargetID(newTargetId)) { + sbi.writeTargetCfgFile(newTargetId); + } + } catch (SBIException e) { + e.printStackTrace(); + } + PlatformConfigurationManager.setBuildTargetName(config, newTargetId); + RootstrapManager.setSelectedRootstrap(rootstrap); + RootstrapManager.notifyChangedRootstrap(); + + ManagedBuildManager.saveBuildInfo( project, true ); + } + + private boolean verifyActiveRootstrap(IProject project, PlatformRootstrap rootstrap ) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + IConfiguration config = info.getDefaultConfiguration(); + String rootArch = rootstrap.getArch(); + + if (PlatformConfigurationManager.isEmulatorConfiguration(config)) { + if (!PlatformConfigurationManager.isEmulatorArch(rootArch)) { + return false; + } + } else if (PlatformConfigurationManager.isDeviceConfiguration(config)) { + if (!PlatformConfigurationManager.isDeviceArch(rootArch)) { + return false; + } + } + + return true; + } + + + public void selectionPkgMgr() + { + doActionForEntry(new IActionForEntry() + { + @Override + public void doAction() + { + Table table = tableViewer.getTable(); + TableItem[] item = table.getSelection(); + final PlatformRootstrap selected = (PlatformRootstrap)item[0].getData(); + boolean initialized = new File(selected.getPath().toOSString()).exists() ? true : false; + if (!initialized) { + // ask whether user want to initialize roootstrap + int ret = DialogUtil.openQuestionDialog(resources.getString("Action.Msg.Question.NotInit")); + if ( ret != SWT.YES ) { + return; + } + + // generate base file system here if "YES" + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + monitor.beginTask(resources.getString("GenRootDlg.Progress.Msg.Generating"), -1); + if( !RootstrapManager.generateBaseFileSystem(selected.getPath().toString(), + selected.getArch(), selected.getRepositoryURLs(), monitor) ) { + throw new InterruptedException("Generating base file system failed!"); + } + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog(String.format("%s\n * %s", + resources.getString("GenRootDlg.Error.Gen.Rootstrap.Failed"), + e.getMessage())); + return; + } catch (InterruptedException e) { + DialogUtil.openErrorDialog(String.format("%s\n * %s", + resources.getString("GenRootDlg.Error.Gen.Rootstrap.Failed"), + e.getMessage())); + return; + } + + selected.setInitialized(true); + } + + // launch package manager + final RPMPackageDialog dlg = new RPMPackageDialog(shell, selected); + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("Action.Msg.Progress.Initializing.PkgMgr"), -1); + dlg.initializeDialogData(monitor); + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( String.format("%s\n * %s\n * %s", + resources.getString("Action.Msg.Error.InitFailed.PkgMgr"), + e.getMessage(), "If no response for long time, check your proxy setting." ) ); + return; + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( String.format("%s\n * %s\n * %s", + resources.getString("Action.Msg.Error.InitFailed.PkgMgr"), + e.getMessage(), "If no response for long time, check your proxy setting." ) ); + return; + } + + dlg.open(); + + RootstrapManager.modifyRootstrap( selected ); + } + + @Override + public boolean doCheckEnable() + { + return true; + } + }); + } + + + public void removeRootstrap() + { + doActionForEntry(new IActionForEntry() + { + @Override + public void doAction() + { + Table table = tableViewer.getTable(); + TableItem[] item = table.getSelection(); + final PlatformRootstrap selected = (PlatformRootstrap)item[0].getData(); + + // default rootstrap cannot be removed! + PlatformRootstrap defaultRootstrap = RootstrapManager.getDefaultRootstrap( selected.getArch() ); + if ( defaultRootstrap.getId().equals(selected.getId()) ) { + DialogUtil.openErrorDialog(resources.getString("Action.Msg.Error.RemoveDefault")); + return; + } + + IWorkspace works = ResourcesPlugin.getWorkspace(); + IProject[] projs = works.getRoot().getProjects(); + for (IProject proj : projs) { + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(proj); + if ( info == null ) continue; + IConfiguration config = info.getDefaultConfiguration(); + if ( config == null ) continue; + IManagedProject managedProject = config.getManagedProject(); + String projectArtifactType = managedProject.getProjectType() != null ? + managedProject.getProjectType().getBuildArtefactType().getId() : null; + if ( managedProject == null || + projectArtifactType != PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE) continue; + + setActiveRootstrap( proj, defaultRootstrap ); + } + + // remove + RootstrapManager.removeRootstrap(selected.getId()); + } + + @Override + public boolean doCheckEnable() + { + return true; + } + }); + } + + + public void exportRootstrap() + { + doActionForEntry(new IActionForEntry() + { + @Override + public void doAction() + { + // get rootstrap + Table table = tableViewer.getTable(); + TableItem[] item = table.getSelection(); + final PlatformRootstrap selectedRootstrap = (PlatformRootstrap)item[0].getData(); + + // check whether rootstrap is initialized + if ( !selectedRootstrap.isInitialized() ) { + DialogUtil.openErrorDialog(resources.getString("Action.Msg.Error.ExportUninitialzed")); + return; + } + + FileDialog fd = new FileDialog( shell, SWT.SAVE); + fd.setText(resources.getString("FileDlg.Title.Export")); + String[] extensions = {"*.tar"}; + fd.setFilterExtensions(extensions); + String resultFilePath = fd.open(); + if ( !resultFilePath.endsWith(".tar")) { + resultFilePath += ".tar"; + } + final String selectedFilePath = resultFilePath; + if (selectedFilePath != null) { + // generate rootstrap here + ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell); + try { + dialog.run(true, true, new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, + InterruptedException { + + monitor.beginTask(resources.getString("Action.Msg.Progress.Exporting"), -1); + boolean result = RootstrapManager.exportRootstrap( selectedRootstrap, selectedFilePath, monitor ); + if ( result ) { + DialogUtil.openMessageDialog(shell,resources.getString("Action.Msg.Info.ExportOK")); + } + else { + DialogUtil.openMessageDialog(shell, resources.getString("Action.Msg.Error.ExportFailed")); + } + } + }); + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog( String.format("%s\n * %s", + resources.getString("Action.Msg.Error.ExportFailed"), + e.getMessage() ) ); + return; + } catch (InterruptedException e) { + DialogUtil.openErrorDialog( String.format("%s\n * %s", + resources.getString("Action.Msg.Error.ExportFailed"), + e.getMessage() ) ); + return; + } + } + } + + @Override + public boolean doCheckEnable() + { + return true; + } + }); + } + + + public void doActionForEntry(IActionForEntry action) + { + if (action.doCheckEnable()) + { + action.doAction(); + } + } + + private interface IActionForEntry + { + boolean doCheckEnable(); + void doAction(); + } + + + + private class TooltableSelectionAdapter extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) { + + final int column = tableViewer.getTable().indexOf((TableColumn) e.widget); + tableViewer.getTable().setSortColumn((TableColumn)e.widget); + if (tableViewer.getTable().getSortDirection() == SWT.DOWN) { + tableViewer.getTable().setSortDirection(SWT.UP); + } else { + tableViewer.getTable().setSortDirection(SWT.DOWN); + } + + tableViewer.setSorter(new ViewerSorter() { + public int compare(Viewer viewer, Object e1, Object e2) { + PlatformRootstrap entry_1 = (PlatformRootstrap)e1; + PlatformRootstrap entry_2 = (PlatformRootstrap)e2; + + switch (column) { + case COL_IDX_ROOTNAME: + if (tableViewer.getTable().getSortDirection() == SWT.DOWN) { + return entry_1.getText().compareTo(entry_2.getText()); + } else { + return entry_2.getText().compareTo(entry_1.getText()); + } + case COL_IDX_ARCH: + if (tableViewer.getTable().getSortDirection() == SWT.DOWN) { + return entry_1.getArch().compareTo(entry_2.getArch()); + } else { + return entry_2.getArch().compareTo(entry_1.getArch()); + } + default: + break; + } + return entry_1.getText().compareTo(entry_2.getText()); + } + }); + + } + } + + + /* selected package table provider */ + private class TableViewerProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public Image getColumnImage(Object element, int columnIndex) { + if ( element instanceof PlatformRootstrap) { + PlatformRootstrap t = (PlatformRootstrap)element; + boolean checked = t.isChecked(); + if (checked && columnIndex == COL_IDX_ROOTNAME) { + Image checkIcon = ImageUtil.getImage(Activator.PLUGIN_ID, "icons/rootstrap/successed.png"); + return checkIcon; + } + } + return null; + } + + @Override + public String getColumnText(Object element, int columnIndex) { + if ( element instanceof PlatformRootstrap) { + PlatformRootstrap t = (PlatformRootstrap)element; + String name = t.getText(); + String arch = t.getArch(); + + switch(columnIndex) { + case COL_IDX_ROOTNAME : + return name; + case COL_IDX_ARCH: + return getArchitectureCategory(arch); + default: + break; + } + } + return null; + } + } + + + private String getArchitectureCategory(String arch) { + if ( arch.toLowerCase().contains("arm")) { + return "arm"; + } + else { + return "x86"; + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/SelectRootstrapMappingDialog.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/SelectRootstrapMappingDialog.java new file mode 100644 index 0000000..f324dec --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/views/ui/SelectRootstrapMappingDialog.java @@ -0,0 +1,183 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.views.ui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.ResourceBundle; + +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.dialogs.Dialog; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.tizen.nativecommon.build.SmartBuildInterface; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.views.model.PlatformRootstrap; + +public class SelectRootstrapMappingDialog extends Dialog { + + private ArrayList rootstrapList = new ArrayList(); + private ArrayList rootstrapNames = new ArrayList(); + private HashMap> projectMap = new HashMap>(); + private HashMap comboMap = new HashMap(); + private String rootName = ""; + + private int x = 0; + private int y = 0; + private final int width = 400; + private final int height = 400; + + private final String BUNDLE_NAME = AddRootstrapDialog.class.getPackage().getName() + ".RootstrapUIMessages";//$NON-NLS-1$ + private ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + public SelectRootstrapMappingDialog(Shell parentShell, String rootName, + HashMap> projectMap, + ArrayList rootstrapList) { + super(parentShell); + this.projectMap = projectMap; + this.rootName = rootName; + this.rootstrapList = rootstrapList; + + Rectangle bounds = parentShell.getBounds(); + x = bounds.x + (bounds.width - width)/2; + y = bounds.y + (bounds.height - height)/2; + + for (PlatformRootstrap r : rootstrapList) { + rootstrapNames.add(r.getName()); + } + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText(resources.getString("SelectRootDlg.Title")); + newShell.setLocation(x, y); + //newShell.setSize(width, height); + } + + @Override + protected Control createDialogArea(Composite parent) { + + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING)); + composite.setLayout(new GridLayout(1, false)); + + createDescComposite(composite); + createSettingComposite(composite); + return null; + } + + private void createDescComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(1, false)); + + Label descLabel = new Label(composite, SWT.NONE); + descLabel.setText(String.format(resources.getString("SelectRootDlg.Label.Desc"), rootName, rootName)); + } + + private void createSettingComposite(Composite parent) { + Composite composite = new Composite( parent, SWT.NONE); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + composite.setLayout(new GridLayout(2, false)); + + for (Entry> e : projectMap.entrySet()) { + for (Entry _e : e.getValue().entrySet()) { + IProject project = _e.getKey(); + IConfiguration config = _e.getValue(); + Label nameLabel = new Label(composite, SWT.NONE); + nameLabel.setText(getLabelName(project.getName(), config.getName())); + GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + //nameLabel.setLayoutData(gridData); + Combo rootstrapCombo = new Combo(composite, SWT.READ_ONLY); + rootstrapCombo.setLayoutData(gridData); + rootstrapCombo.setItems(rootstrapNames.toArray(new String[0])); + rootstrapCombo.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + {} + }); + + rootstrapCombo.select(0); + comboMap.put(nameLabel.getText(), rootstrapCombo); + } + + } + } + + private String getLabelName(String project, String config) { + return project + " [" + config + "]"; + } + + @Override + protected void okPressed() { + for (Entry> e : projectMap.entrySet()) { + for (Entry _e : e.getValue().entrySet()) { + IProject project = _e.getKey(); + IConfiguration config = _e.getValue(); + Combo combo = comboMap.get(getLabelName(project.getName(), config.getName())); + String rootName = combo.getText(); + + SmartBuildInterface sbi = SmartBuildInterface.getInstance(); + String targetId = PlatformConfigurationManager.getBuildTargetName(config); + String toolId = sbi.getToolchainIDFromTargetID(targetId); + + for (PlatformRootstrap r : rootstrapList) { + if (rootName.equals(r.getName())) { + String id = r.getId(); + String newTargetId = sbi.makeTargetID(id, toolId); + PlatformConfigurationManager.setBuildTargetName(config, newTargetId); + break; + } + } + } + } + + super.okPressed(); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TemplateTizenPlatformNewWizard.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TemplateTizenPlatformNewWizard.java new file mode 100644 index 0000000..ccd3c47 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TemplateTizenPlatformNewWizard.java @@ -0,0 +1,164 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import org.eclipse.cdt.core.templateengine.TemplateDescriptor; +import org.eclipse.cdt.ui.wizards.EntryDescriptor; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.wizard.IWizard; +import org.eclipse.osgi.util.NLS; +import org.tizen.common.core.application.InstallPathConfig; +import org.tizen.common.util.log.Logger; +import org.tizen.nativeappcommon.templateengine.TizenTemplateProcessParser; +import org.tizen.nativeappcommon.wizards.Messages; +import org.tizen.nativeappcommon.wizards.TemplateTizenNewWizard; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.git.GitDescManager; +import org.tizen.nativeplatform.git.GitIndexParserFactory; +import org.tizen.nativeplatform.git.IGitIndexParser; +import org.tizen.nativeplatform.git.model.GitDescription; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.w3c.dom.Element; + +public class TemplateTizenPlatformNewWizard extends TemplateTizenNewWizard { + + public static final String DIR_RPM = "rpm"; + public static final String DIR_PLATFORM = "platform"; + public static final String DIR_GIT = "Git"; + public static final String DIR_DELIMITER = "/"; + public static final String[] ID_TEMPLATE = {"PlatformProject"}; + public static final String[] ID_PROJTYPE = {PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE}; //$NON-NLS-1$ //$NON-NLS-2$ + + public static final IPath templatePath = new Path(InstallPathConfig.getSamplesPath()). + append(DIR_PLATFORM).append(DIR_RPM); + + @Override + public EntryDescriptor[] createItems(boolean supportedOnly, IWizard wizard) { + + List items = new ArrayList(); + + Stack fileStack = new Stack(); + IPath rootPath = this.getTemplatePath(); + + fileStack.push(rootPath); + boolean found = false; + + while(!fileStack.isEmpty()) { + IPath templatePath = fileStack.pop(); + + File templateFile = templatePath.toFile(); + + if(templateFile.exists()) { + + File sampleFile = templatePath.append(FILE_SAMPLE).toFile(); + if(sampleFile.exists() && sampleFile.isFile()) { + found = true; + EntryDescriptor entryDes = getEntryDesc(TizenTemplateProcessParser.createTemplateDesc(sampleFile), templatePath.lastSegment()); + IPath sourcePath = templatePath.removeLastSegments(1); + if(sourcePath.segmentCount() != rootPath.segmentCount()) { + entryDes.setPath(templatePath.removeLastSegments(1).makeRelativeTo(rootPath).toString()); + } + else { + entryDes.setPath(null); + } + items.add(entryDes); + } + else { + for(File subFile: templateFile.listFiles()) { + if(subFile.isDirectory()) { + fileStack.push(new Path(subFile.getPath())); + } + } + } + } + } + + if(found == false) { + Logger.error(NLS.bind(Messages.EXCEPTION_WHILE_PROJECT_CREATION_3, rootPath)); + } + + /* create git items */ + String projTypeName = PlatformConfigurationManager.TIZEN_PLATFORM_ARTIFACT_TYPE; + PreferencesManager.SiteConfiguration config = PreferencesManager.loadActiveSiteConfiguration(); + + if (config != null ) { + EntryDescriptor gitEntryDes = null; + ArrayList gitDescs = null; + + IGitIndexParser parser = GitIndexParserFactory.getIndexParser(config); + gitDescs = parser.parse(config); + if (gitDescs != null) { + GitDescManager.setDescs(gitDescs); + } + + if (gitDescs != null) { + for (GitDescription n : gitDescs) { + Path gitPath = new Path(n.getProject()); + String name = gitPath.lastSegment(); + String dir = gitPath.removeLastSegments(1).toString(); + dir = DIR_GIT + DIR_DELIMITER + dir; + gitEntryDes = new EntryDescriptor(getTemplateID(projTypeName), projTypeName, name, false, null, null); + gitEntryDes.setPath(dir); + items.add(gitEntryDes); + } + } + } + + return items.toArray(new EntryDescriptor[items.size()]); + } + + private EntryDescriptor getEntryDesc(TemplateDescriptor descriptor, + String label) { + String projTypeName; + Element root = descriptor.getRootElement(); + Element slpPropertyElement = TizenTemplateProcessParser.getElementFromTag(root, TizenTemplateProcessParser.TAG_SLPPROPERTY); + slpPropertyElement = TizenTemplateProcessParser.getElementFromTag(slpPropertyElement, TizenTemplateProcessParser.TAG_PROPERTYGROUP); + projTypeName = TizenTemplateProcessParser.getTextContextFromElement(slpPropertyElement, TizenTemplateProcessParser.TAG_PROJTYPE); + return new EntryDescriptor(getTemplateID(projTypeName), projTypeName, label, false, null, null); + } + + public IPath getTemplatePath() { + return templatePath; + } + + public String getTemplateID(String projTypeName) { + + for(int i=0; i -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards; import java.util.ArrayList; @@ -54,9 +53,9 @@ public class TizenDebianMainWizardPage extends CDTMainWizardPage { // remove default empty project if ( e.getName() != null && e.getName().equals("Empty Project") ) continue; - - if( e.getId().equals("com.samsung.slp.nativeide.buildArtefactType.cdeb") || - (e.getParentId() != null && e.getParentId().equals("com.samsung.slp.nativeide.buildArtefactType.cdeb")) ) { + + if( e.getId().equals("org.tizen.nativeide.buildArtefactType.platform") || + (e.getParentId() != null && e.getParentId().equals("org.tizen.nativeide.buildArtefactType.platform")) ) { result.add(item); } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenDebianProjectWizard.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenDebianProjectWizard.java index 4e6c6e2..581db32 100644 --- a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenDebianProjectWizard.java +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenDebianProjectWizard.java @@ -1,31 +1,30 @@ /* -* Inhouse -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Taejun Ha -* Jiil Hyoun -* Donghyuk Yang -* Hoon Kang -* DongHee Yang -* -* 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 -* -*/ + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards; import org.eclipse.cdt.core.CCProjectNature; @@ -45,8 +44,8 @@ import org.tizen.nativeplatform.build.PlatformConfigurationManager; public class TizenDebianProjectWizard extends CDTCommonProjectWizard{ public TizenDebianProjectWizard() { - super("Tizen Custom Debian Project", //$NON-NLS-1$ - "Create a Tizen Custom Debian Project project of selected type"); //$NON-NLS-1$ + super("Tizen Platform Project", //$NON-NLS-1$ + "Create a Tizen Platform Project project of selected type"); //$NON-NLS-1$ // WizardConstants.isDebian = true; } @@ -65,7 +64,10 @@ public class TizenDebianProjectWizard extends CDTCommonProjectWizard{ continueCreationMonitor.beginTask("Add C/C++ Project Nature", 1); CProjectNature.addCNature(prj, new SubProgressMonitor(continueCreationMonitor, 1)); CCProjectNature.addCCNature(prj, new SubProgressMonitor(continueCreationMonitor, 1)); - } catch (CoreException e) {} + } catch (CoreException e) { + // nothing to do + e.printStackTrace(); + } finally {continueCreationMonitor.done();} return prj; } @@ -73,8 +75,8 @@ public class TizenDebianProjectWizard extends CDTCommonProjectWizard{ @Override public void addPages() { fMainPage= new TizenDebianMainWizardPage(CUIPlugin.getResourceString("CProjectWizard")); - fMainPage.setTitle("Tizen Custom Debian Project"); - fMainPage.setDescription("Create a Tizen Custom Debian Project project of selected type"); + fMainPage.setTitle("Tizen Platform Project"); + fMainPage.setDescription("Create a Tizen Platform Project project of selected type"); addPage(fMainPage); } @@ -88,7 +90,7 @@ public class TizenDebianProjectWizard extends CDTCommonProjectWizard{ IProject prj = super.getProject(defaults, onFinish); // Marking project version - PlatformConfigurationManager.setProjectVersion( prj, PlatformConfigurationManager.CURRENT_SLP_PROJECT_VERSION ); + PlatformConfigurationManager.setProjectVersion( prj, PlatformConfigurationManager.CURRENT_SLP_PROJECT_VERSION, true); return prj; } diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformMainWizardPage.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformMainWizardPage.java new file mode 100644 index 0000000..1d6da7f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformMainWizardPage.java @@ -0,0 +1,321 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; + +import org.eclipse.cdt.core.templateengine.TemplateDescriptor; +import org.eclipse.cdt.managedbuilder.ui.wizards.ManagedBuildWizard; +import org.eclipse.cdt.ui.wizards.CNewWizard; +import org.eclipse.cdt.ui.wizards.EntryDescriptor; +import org.eclipse.cdt.ui.wizards.IWizardItemsListListener; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.jface.wizard.IWizard; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.PlatformUI; +import org.mihalis.opal.preferenceWindow.PWTab; +import org.mihalis.opal.preferenceWindow.PreferenceWindow; +import org.tizen.common.TizenHelpContextIds; +import org.tizen.common.util.ImageUtil; +import org.tizen.common.util.SWTUtil; +import org.tizen.common.util.log.Logger; +import org.tizen.nativeappcommon.Activator; +import org.tizen.nativeappcommon.templateengine.TizenTemplateProcessParser; +import org.tizen.nativeappcommon.wizards.TemplateTizenNewWizard; +import org.tizen.nativeappcommon.wizards.TizenMainWizardPage; +import org.tizen.nativeappcommon.wizards.WizardConstants; +import org.tizen.nativeappcommon.wizards.Messages; +import org.tizen.nativeappcommon.wizards.model.TizenNativeTreeGroupModel; +import org.tizen.nativeappcommon.wizards.model.TizenNativeTreeRootModel; +import org.tizen.nativeplatform.git.GitDescManager; +import org.tizen.nativeplatform.wizards.model.TizenPlatformTemplateModel; +import org.tizen.nativeplatform.wizards.ui.TizenPlatformPWComposite; + +import org.w3c.dom.Element; + +@SuppressWarnings("unchecked") +public class TizenPlatformMainWizardPage extends TizenMainWizardPage { + + protected final String[] TAB_NAMES = {Messages.TizenMainWizardPage_Category_App}; + protected final String[] TAB_ICON = {"icons/wizard/App_template.png", "icons/wizard/Uncategorized.png"}; + + public static final String NAME_PATTERN = "^[a-zA-Z]+[a-zA-Z0-9]{" + (WizardConstants.NAME_MIN_LENGTH -1 ) + "," + (WizardConstants.NAME_MAX_LENGTH-1) + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + private boolean pageError = false; + + public TizenPlatformMainWizardPage() { + super(""); + } + + public TizenPlatformMainWizardPage(String pageName) { + super(pageName); + } + + @Override + public void createControl(Composite parent) { + setMinimumSize(parent); + mainComposite = new Composite(parent, SWT.NONE); + this.setControl(mainComposite); + mainComposite.setLayout(new GridLayout()); + mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + toolchainComposite = new Composite(mainComposite, SWT.None); + SWTUtil.setGridLayoutData(toolchainComposite, 0, 0, -1, -1, SWT.NONE); + + List eds = updateData(toolchainComposite, this, getWizard()); + List modelRoots = createModelRoot(eds); + + PreferenceWindow window = PreferenceWindow.create(new HashMap()); + + for (TizenNativeTreeRootModel root: modelRoots) { + String name = root.getName(); + + String iconPath = root.getIconPath(); + Image tabImage = null; + if(iconPath != null) { + tabImage = ImageUtil.getImage(Activator.PLUGIN_ID, root.getIconPath()); + } + PWTab documentTab = window.addTab(tabImage, name); + TizenPlatformPWComposite pwComposite = new TizenPlatformPWComposite(name, root, this); + documentTab.add(pwComposite); + } + + window.buildTabs(mainComposite, new Color(SWTUtil.getDisplay(), this.selectedTabColor[0], this.selectedTabColor[1], this.selectedTabColor[2])); + + this.newProjectChecker.createGroupComposite(mainComposite); + + setPageComplete(validatePage()); + setErrorMessage(null); + setMessage(null); + + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, TizenHelpContextIds.HELP_NATIVE_PROJECT_WIZARD_CONTEXT); + } + + @Override + protected List updateData(Composite right, IWizardItemsListListener ls, IWizard wizard) { + + IExtensionPoint extensionPoint = + Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID); + if (extensionPoint == null) return null; + IExtension[] extensions = extensionPoint.getExtensions(); + if (extensions == null) return null; + + List items = new ArrayList(); + for (int i = 0; i < extensions.length; ++i) { + IConfigurationElement[] elements = extensions[i].getConfigurationElements(); + for (IConfigurationElement element : elements) { + if (element.getName().equals(ELEMENT_NAME)) { + CNewWizard w = null; + try { + w = (CNewWizard) element.createExecutableExtension(CLASS_NAME); + } catch (CoreException e) { + Logger.error(Messages.EXCEPTION_WHILE_PROJECT_CREATION_2, e); + } + if (w == null) return null; + + if(w instanceof ManagedBuildWizard) { + w.setDependentControl(right, ls); + for (EntryDescriptor ed : w.createItems(true, wizard)) + items.add(ed); + } + else if(w instanceof TemplateTizenPlatformNewWizard) { + w.setDependentControl(right, ls); + EntryDescriptor[] eds = ((TemplateTizenPlatformNewWizard)(w)).createItems(true, wizard); + + + for (EntryDescriptor ed : eds) + items.add(ed); + } + } + } + } + + //remove empty templates + for (int i = 0; i < items.size(); ++i) + { + EntryDescriptor ed = items.get(i); + if (ed.isDefaultForCategory()) + { + items.remove(i); + i--; + } + } + + // bug # 211935 : allow items filtering. + if (ls != null) // NULL means call from prefs + items = ls.filterItems(items); + + return items; + } + + @Override + protected String getProjectNamePattern() { + return WizardConstants.CPP_NAME_PATTERN; + } + + @Override + protected IPath getTemplatePath() { + return TemplateTizenPlatformNewWizard.templatePath; + } + + @Override + protected List createModelRoot(List eds) { + + List rootModels = new ArrayList(); + Hashtable testedEntryDescriptors = new Hashtable(); + + for(int i=0; i(), TAB_ICON[i])); + } + + boolean found3 = false; + + for(EntryDescriptor ed: eds) { + + if(ed.getParentId() != null) { + + boolean found1 = false; + String tempPath = ed.getPath(); + for(EntryDescriptor ed2: eds) { + if(ed2.getId().equals(ed.getParentId())) { + found3 = true; + found1 = true; + ed.setParentId(null); + ed.setPath(ed2.getId() + "/" + ed.getId()); + ed.setParent(ed2); + // Do Not check the applicability when the same type is already checked + if ( ed2.getHandler() != null && + testedEntryDescriptors.containsKey(ed.getId()) && + testedEntryDescriptors.get(ed.getId()).equals(ed2.getId()) ) { + + ed.setHandler(ed2.getHandler()); + } + else if ( ed2.getHandler() != null && + ed2.getHandler().isApplicable(ed) ) { + + testedEntryDescriptors.put(ed.getId(), ed2.getId()); + ed.setHandler(ed2.getHandler()); + } + break; + } + } + if(found1 == false) continue; + + List categories = null; + IPath descPath = null; + if(tempPath == null) { + categories = new ArrayList(); + categories.add(DEFAULT_TAB); + categories.add(DEFAULT_CATEGORY); + descPath = this.getTemplatePath().append("").append(ed.getName()); + } + else { + categories = Arrays.asList(tempPath.split("/")); + descPath = this.getTemplatePath().append(tempPath).append(ed.getName()); + } + + if (categories.get(0).equals("Git")) { + descPath = new Path(tempPath.substring(4) + "/" + ed.getName()); + TizenNativeTreeGroupModel entry = addChildEntry(rootModels, categories); + TizenPlatformTemplateModel template = new TizenPlatformTemplateModel( + ed.getName(), ed, null, null, null, + GitDescManager.getDesc(descPath.toString())); + entry.addTemplate(template); + } else { + IPath samplePath = descPath.append(TemplateTizenNewWizard.FILE_SAMPLE); + File sampleFile = samplePath.toFile(); + IPath iconPath = null; + + TemplateDescriptor templateDesc = TizenTemplateProcessParser.createTemplateDesc(sampleFile); + + Element root = templateDesc.getRootElement(); + Element slpPropertyElement = TizenTemplateProcessParser.getElementFromTag(root, TizenTemplateProcessParser.TAG_SLPPROPERTY); + slpPropertyElement = TizenTemplateProcessParser.getElementFromTag(slpPropertyElement, TizenTemplateProcessParser.TAG_PROPERTYGROUP); + + String projDesc = TizenTemplateProcessParser.getTextContextFromElement(slpPropertyElement, TizenTemplateProcessParser.TAG_DESC); + String label = TizenTemplateProcessParser.getTextContextFromElement(slpPropertyElement, TizenTemplateProcessParser.TAG_SAMPLE); + String icon = TizenTemplateProcessParser.getTextContextFromElement(slpPropertyElement, TizenTemplateProcessParser.TAG_WIZARD_ICON); + + if(icon != null) { + iconPath = descPath.append(icon); + } + + TizenNativeTreeGroupModel entry = addChildEntry(rootModels, categories); + + if(projDesc != null) { + descPath = descPath.append(projDesc); + } + else { + descPath = this.getTemplatePath().append(TemplateTizenNewWizard.FILE_DESC); + } + + //TizenNativeTemplateModel template = new TizenNativeTemplateModel(label, ed, descPath, samplePath, iconPath); + TizenPlatformTemplateModel template = new TizenPlatformTemplateModel(label, ed, descPath, samplePath, iconPath, null); + entry.addTemplate(template); + } + } + } + + if(!found3) { + Logger.error(Messages.EXCEPTION_WHILE_PROJECT_CREATION_1); + } + return rootModels; + } + + public TizenPlatformTemplateModel getLastSelectedTemplate() { + return (TizenPlatformTemplateModel)lastSelectedTemplate; + } + + public void setPageError(boolean value) { + this.pageError = value; + } + + @Override + public boolean validatePage() { + if (pageError) { + return false; + } else { + return super.validatePage(); + } + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformProjectWizard.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformProjectWizard.java new file mode 100644 index 0000000..47ee79a --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/TizenPlatformProjectWizard.java @@ -0,0 +1,170 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.net.URISyntaxException; +import java.util.ResourceBundle; + +import org.eclipse.cdt.core.templateengine.TemplateCore; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jgit.storage.file.FileRepository; + +import org.tizen.common.util.DialogUtil; +import org.tizen.nativeappcommon.wizards.TizenProjectWizard; +import org.tizen.nativeplatform.build.PlatformConfigurationManager; +import org.tizen.nativeplatform.git.GitCommander; +import org.tizen.nativeplatform.git.model.GitDescription; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.nativeplatform.wizards.model.TizenPlatformTemplateModel; + +public class TizenPlatformProjectWizard extends TizenProjectWizard { + + private final static String BUNDLE_NAME = TizenPlatformProjectWizard.class.getPackage().getName() + ".WizardUIMessages";//$NON-NLS-1$ + private static ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + private final static String Title = resources.getString("WizardPage.Title"); + private final static String Description = resources.getString("WizardPage.Description"); + + public TizenPlatformProjectWizard() { + super(Title, Description); + } + + @Override + public void addPages() { + fMainPage= new TizenPlatformMainWizardPage(resources.getString("WizardPage.Name")); //$NON-NLS-1$ + fMainPage.setTitle(Title); + fMainPage.setDescription(Description); + addPage(fMainPage); + } + + @Override + public boolean performFinish() { + + boolean result = false; + + IPath projectPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(fMainPage.getProjectName()); + TizenPlatformTemplateModel selectedTemplate = ((TizenPlatformMainWizardPage)fMainPage).getLastSelectedTemplate(); + GitDescription desc = selectedTemplate.getDesc(); + + String sshConn = PreferencesManager.getActiveGitBaseURI(); + GitCommander commander = new GitCommander(sshConn); + if (desc != null) { + // this is git project + IPath gitPath = new Path(selectedTemplate.getDesc().getProject()); + // cloning git project + try { + if (!commander.CloneOperation(projectPath, gitPath, getContainer())) { + return false; + } + } catch (InvocationTargetException e) { + DialogUtil.openErrorDialog(e.getTargetException().getMessage()); + e.printStackTrace(); + return false; + } catch (URISyntaxException e) { + DialogUtil.openErrorDialog(e.getMessage()); + e.printStackTrace(); + return false; + } catch (IOException e) { + DialogUtil.openErrorDialog(e.getMessage()); + e.printStackTrace(); + return false; + } + + result = super.performFinish(); + + // apply shared project + commander.ApplySharedProject(newProject, getContainer()); + } + else { + + result = super.performFinish(); + + try { + FileRepository gitRepos = new FileRepository(newProject.getLocation().toString()+"/.git"); + gitRepos.create(); + } catch (IOException e) { + DialogUtil.openMessageDialog("Warning: Converting the project to Git failed!"); + } + commander.ApplySharedProject(newProject, getContainer()); + } + + return result; + } + + @Override + public IProject getProject(boolean defaults, boolean onFinish) { + IProject prj = super.getProject(defaults, onFinish); + + // Marking project version + PlatformConfigurationManager.setProjectVersion( prj, PlatformConfigurationManager.CURRENT_SLP_PROJECT_VERSION, true); + + return prj; + } + + @Override + public String getTemplateIdFromProjectType(String projectType) { + return null; + } + + @Override + public void setValueStoreForTemplateProcess(TemplateCore template) { + } + + @Override + public void addValueStoreWithFramework(String projectType) { + // TODO Auto-generated method stub + + } + + @Override + public void initializeValueStore(String projectType) { + // TODO Auto-generated method stub + + } + + @Override + protected void createCDTDescriptionTemplate(TemplateCore selectedTemplate, + IPath projectPath, String projectType) throws IOException { + //Do nothing + } + + @Override + protected void doTemplatePreprocess(IPath projectPath, String _projectType) { + //Do nothing + } + + @Override + public boolean isExpressMode() { + return false; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/WizardUIMessages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/WizardUIMessages.properties new file mode 100644 index 0000000..55a44ba --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/WizardUIMessages.properties @@ -0,0 +1,10 @@ +WizardPage.Title = Tizen Platform Project +WizardPage.Name = Tizen Platform Project Wizard +WizardPage.Description = Create a Tizen Platform project of selected type + +WizardPage.GitInfo.Description = Description +WizardPage.GitInfo.Owner = Owner +WizardPage.GitInfo.LastChange = Last Change +WizardPage.GitInfo.Error = Error +WizardPage.GitError.FailedGet.Messsage = Failed to get git project +WizardPage.GitError.CantCreate.Messsage = You can not create this project diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/model/TizenPlatformTemplateModel.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/model/TizenPlatformTemplateModel.java new file mode 100644 index 0000000..fe9d15f --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/model/TizenPlatformTemplateModel.java @@ -0,0 +1,45 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards.model; + +import org.eclipse.cdt.ui.wizards.EntryDescriptor; +import org.eclipse.core.runtime.IPath; +import org.tizen.nativeappcommon.wizards.model.TizenNativeTemplateModel; +import org.tizen.nativeplatform.git.model.GitDescription; + +public class TizenPlatformTemplateModel extends TizenNativeTemplateModel { + private GitDescription desc; + public TizenPlatformTemplateModel(String name, EntryDescriptor ed, IPath descPath, IPath samplePath, IPath iconPath, GitDescription desc) { + super(name, ed, descPath, samplePath, iconPath); + this.desc = desc; + } + + public GitDescription getDesc() { + return desc; + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/Messages.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/Messages.java new file mode 100644 index 0000000..77ca880 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/Messages.java @@ -0,0 +1,46 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards.ui; + +import org.eclipse.osgi.util.NLS; +import org.tizen.nativeappcommon.Activator; + +public class Messages extends NLS { + + private static final String BUNDLE_NAME = Activator.PLUGIN_ID + ".wizards.ui.messages";//$NON-NLS-1$ + + private Messages() { + // Do not instantiate + } + + public static String TizenNativePWComposite_WizardToolTipText; + + static { + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/TizenPlatformPWComposite.java b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/TizenPlatformPWComposite.java new file mode 100644 index 0000000..72b6857 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/TizenPlatformPWComposite.java @@ -0,0 +1,513 @@ +/* + * Native Platform + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Donghyuk Yang + * DongHee Yang + * Kangho Kim + * + * 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.nativeplatform.wizards.ui; + +import java.util.ArrayList; +import java.util.List; +import java.util.ResourceBundle; +import java.util.Stack; + +import org.eclipse.cdt.ui.wizards.EntryDescriptor; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.browser.OpenWindowListener; +import org.eclipse.swt.browser.WindowEvent; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.graphics.Region; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; +import org.mihalis.opal.preferenceWindow.widgets.PWWidget; +import org.tizen.common.util.HelpBrowser; +import org.tizen.common.util.ImageUtil; +import org.tizen.common.util.SWTUtil; +import org.tizen.nativeappcommon.wizards.TizenMainWizardPage; +import org.tizen.nativeappcommon.wizards.model.TizenNativeTemplateModel; +import org.tizen.nativeappcommon.wizards.model.TizenNativeTreeGroupModel; +import org.tizen.nativeappcommon.wizards.model.TizenNativeTreeRootModel; +import org.tizen.nativeappcommon.Activator; +import org.tizen.nativeplatform.git.model.GitDescription; +import org.tizen.nativeplatform.preferences.PreferencesManager; +import org.tizen.nativeplatform.wizards.TizenPlatformMainWizardPage; +import org.tizen.nativeplatform.wizards.TizenPlatformProjectWizard; +import org.tizen.nativeplatform.wizards.model.TizenPlatformTemplateModel; + +public class TizenPlatformPWComposite extends PWWidget { + + private final int textMargin = 30; + private final int tableWidth = 250; + private Tree tree; + private Table table; + + private TizenNativeTreeRootModel modelRoot; + private Browser descBrowser; + private final TizenPlatformMainWizardPage wizardPage; + private TableViewer gitDescTable; + private int browserWidth = 418; + private static Color topColor = new Color(Display.getDefault(), 168, 198, 255); // Top Color + private static Color bottomColor = new Color(Display.getDefault(), 104, 151, 239); // Bottom Color + + private static String IMAGE_TREE_BG = "images/wizard/tree_viewer_bg.png"; + private static String IMAGE_TABLE_BG = "images/wizard/list_viewer_bg.png"; + private final String GIT_CATEGORY = "Git"; + private final String TABLE_DATA_DELIMITER = "::"; + + private final static String BUNDLE_NAME = TizenPlatformProjectWizard.class.getPackage().getName() + ".WizardUIMessages";//$NON-NLS-1$ + private static ResourceBundle resources = ResourceBundle.getBundle(BUNDLE_NAME); + + public TizenPlatformPWComposite(final String label, TizenNativeTreeRootModel modelRoot, TizenPlatformMainWizardPage page) { + super(label, null, 1, true); + this.modelRoot = modelRoot; + this.wizardPage = page; + + setAlignment(GridData.FILL); + } + + @Override + protected Control build(Composite parent) { + this.wizardPage.setLastSelectedTemplate(null); + this.wizardPage.h_selected = null; + + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(3, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + composite.setLayout(gridLayout); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + if (this.getLabel().equals(GIT_CATEGORY)) { + if ( modelRoot.getEntries().size() == 1 && + modelRoot.getEntries().get(0).getName().equals("no_category")) { + createEmptyGitRepositoryComposite(composite); + } + else { + createTree(composite); + createTable(composite); + createGitDescriptionComposite(composite); + } + } else { + createTree(composite); + createTable(composite); + createDescriptionComposite(composite); + } + + + wizardPage.setPageComplete(wizardPage.validatePage()); + return composite; + } + + + private void createEmptyGitRepositoryComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + composite.setLayout(gridLayout); + GridData gridData = new GridData(GridData.FILL_BOTH); + gridData.minimumWidth = this.browserWidth; + composite.setLayoutData(gridData); + + Label emptyGitDescription = new Label(composite, SWT.NONE ) ; + emptyGitDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL,true, true)); + emptyGitDescription.setAlignment(SWT.CENTER); + emptyGitDescription.setText("No Git information! \nUpdate Git Configuration in \"Preferences->Tizen SDK->Platform->Git Configuration\""); + + } + + + private void createTable(Composite parent) { + this.table = new Table(parent, SWT.FULL_SELECTION); + TableColumn column = new TableColumn(this.table, SWT.NONE); + column.setResizable(true); + column.setWidth(this.tableWidth); + + GridData tableGridData = new GridData(GridData.FILL_BOTH); + tableGridData.minimumWidth = this.tableWidth; + table.setLayoutData(tableGridData); + + createTableListener(); + + this.table.setBackgroundImage(ImageUtil.getImage(Activator.PLUGIN_ID, IMAGE_TABLE_BG)); + } + + private void createTableListener() { + final String label = this.getLabel(); + table.addSelectionListener(new SelectionListener() { + @Override + public void widgetSelected(SelectionEvent e) { + boolean errorOccured = false; + if(table.getSelection() != null && table.getSelection().length > 0 ) { + TizenPlatformTemplateModel templateModel = (TizenPlatformTemplateModel) table.getSelection()[0].getData(); + EntryDescriptor ed = templateModel.getEntryDescriptor(); + wizardPage.setLastSelectedTemplate(templateModel); + wizardPage.switchTo(ed.getHandler(), ed); + + if (label.equals(GIT_CATEGORY)) { + GitDescription desc = templateModel.getDesc(); + if (desc == null) { + return; + } + String gitBaseURI = PreferencesManager.getActiveGitBaseURI(); + if (gitBaseURI == "") { + return; + } + + ArrayList inputs = new ArrayList(); + if (errorOccured) { + inputs.add(resources.getString("WizardPage.GitInfo.Error") + + TABLE_DATA_DELIMITER + resources.getString("WizardPage.GitError.FailedGet.Messsage")); + inputs.add(" " + + TABLE_DATA_DELIMITER + resources.getString("WizardPage.GitError.CantCreate.Messsage")); + } else { + inputs.add(resources.getString("WizardPage.GitInfo.Description") + + TABLE_DATA_DELIMITER + desc.getDesc()); + inputs.add(resources.getString("WizardPage.GitInfo.Owner") + + TABLE_DATA_DELIMITER + desc.getOwner()); + } + gitDescTable.setInput(inputs); + + } else { + descBrowser.setUrl(templateModel.getDescPath().toOSString()); + } + if (errorOccured) { + wizardPage.setPageError(true); + } else { + wizardPage.setPageError(false); + } + wizardPage.setPageComplete(wizardPage.validatePage()); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + }); + + // margin + table.addListener(SWT.MeasureItem, new Listener() { + public void handleEvent(Event event) { + TableItem item = (TableItem) event.item; + String text = item.getText(event.index); + Point size = event.gc.textExtent(text); + event.width = size.x + 2 * textMargin; + event.height = Math.max(event.height, size.y + textMargin); + } + }); + // gradient + table.addListener(SWT.EraseItem, new Listener() { + public void handleEvent(Event event) { + event.detail &= ~SWT.HOT; + if ((event.detail & SWT.SELECTED) == 0) { + table.drawBackground(event.gc, 0, event.y, tableWidth, event.height, 0, 0); + return; /* item not selected */ + } + + GC gc = event.gc; + Color oldForeground = gc.getForeground(); + Color oldBackground = gc.getBackground(); + gc.setForeground(topColor); + gc.setBackground(bottomColor); + gc.fillGradientRectangle(0, event.y, tableWidth, event.height, true); + gc.setForeground(oldForeground); + gc.setBackground(oldBackground); + event.detail &= ~SWT.SELECTED; + } + }); + } + + private void createDescriptionComposite(Composite parent) { + descBrowser = new Browser(parent, SWT.NONE); + initializebrowser(SWTUtil.getDisplay(), descBrowser); + GridData gridData = new GridData(GridData.FILL_BOTH); + gridData.minimumWidth = browserWidth; + descBrowser.setLayoutData(gridData); + } + + + private void createGitDescriptionComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(1, false); + gridLayout.marginHeight = 0; + gridLayout.marginWidth = 0; + composite.setLayout(gridLayout); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + createGitInfoComposite(composite); + } + + + private void createGitInfoComposite(Composite parent) { + gitDescTable = new TableViewer(parent, SWT.NONE); + + Table table = gitDescTable.getTable(); + table.setLinesVisible(true); + + gitDescTable.setLabelProvider(new TableViewerProvider()); + gitDescTable.setContentProvider(new ArrayContentProvider()); + + TableColumn column = new TableColumn(table, SWT.NONE); + column.setResizable(true); + //column.setWidth(this.tableWidth); + column.setWidth(100); + + column = new TableColumn(table, SWT.FILL); + column.setResizable(true); + column.setWidth(318); + + GridData tableGridData = new GridData(GridData.FILL_BOTH); + tableGridData.minimumWidth = this.browserWidth; + table.setLayoutData(tableGridData); + } + + private class TableViewerProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + @Override + public String getColumnText(Object element, int columnIndex) { + String[] splitValues = ((String)element).split("::"); + switch(columnIndex) { + case 0: + return splitValues[0]; + case 1: + if (splitValues.length == 2) { + return splitValues[1]; + } else { + return ""; + } + default: + break; + } + return null; + } + } + + private void createTree(Composite parent) { + // Type Tree View + this.tree = new Tree(parent, SWT.NONE); + + // set layout data + GridData treeGridData = new GridData(GridData.FILL_BOTH); + treeGridData.minimumWidth = 200; + this.tree.setLayoutData(treeGridData); + + createTreeItem(parent, modelRoot.getEntries()); + createTreeListener(); + + makeGradientTree(this.tree); + if (!modelRoot.getName().equals(GIT_CATEGORY)) { + SWTUtil.expandTree(this.tree); + } + this.tree.setBackgroundImage(ImageUtil.getImage(Activator.PLUGIN_ID, IMAGE_TREE_BG)); + } + + private void createTreeListener() { + this.tree.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + if(tree.getSelection() != null && tree.getSelection().length > 0) { + TreeItem selectedItem = tree.getSelection()[0]; + Object data = selectedItem.getData(); + + List templateList = ((TizenNativeTreeGroupModel)(data)).getTemplateList(); + if(templateList.size() > 0) { + createTableItem(templateList); + } + else { +// descBrowser.setVisible(false); + wizardPage.setLastSelectedTemplate(null); + wizardPage.h_selected = null; + wizardPage.setPageComplete(wizardPage.validatePage()); + table.removeAll(); + } + } + } + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + }); + } + + private void createTableItem(List templates) { + this.table.removeAll(); + this.table.setLinesVisible(false); + + for(TizenNativeTemplateModel template: templates) { + TableItem tableItem = new TableItem(table, SWT.NONE); + tableItem.setText(template.getName()); + tableItem.setData(template); + + IPath iconPath = template.getIconPath(); + + Image wizardIconImage = null; + if(iconPath != null) { + wizardIconImage = ImageUtil.getImage(ImageDescriptor.createFromFile(null, iconPath.toOSString())); + } + else { + wizardIconImage = ImageUtil.getImage(Activator.PLUGIN_ID, TizenMainWizardPage.DEFAULT_WIZARD_ICON); + } + + tableItem.setImage(wizardIconImage); + } + + if(templates.size() > 0) { + Event e = new Event(); + table.select(0); + e.item = this.table.getSelection()[0]; + this.table.notifyListeners(SWT.Selection, e); + } + } + + + private void createTreeItem(Composite parent, + List entries) { + + Stack entryStack = new Stack(); + Stack treeStack = new Stack(); + + for (TizenNativeTreeGroupModel entry : entries) { + TreeItem treeItem = new TreeItem(this.tree, SWT.None); + treeItem.setText(entry.getName()); + treeItem.setData(entry); + entryStack.push(entry); + treeStack.push(treeItem); + } + + while(!entryStack.isEmpty()) { + TizenNativeTreeGroupModel entry = entryStack.pop(); + TreeItem treeItem = treeStack.pop(); + + for(TizenNativeTreeGroupModel subEntry: entry.getEntries()) { + TreeItem subTreeItem = new TreeItem(treeItem, SWT.None); + subTreeItem.setText(subEntry.getName()); + subTreeItem.setData(subEntry); + entryStack.push(subEntry); + treeStack.push(subTreeItem); + } + } + } + + @Override + protected void check() { + } + + private void initializebrowser(final Display currentDisplay, Browser pBrowser) { + + pBrowser.addOpenWindowListener(new OpenWindowListener() { + @Override + public void open(WindowEvent event) { + if (!event.required) + { + return; /* only do it if necessary */ + } + Shell shell = new Shell(currentDisplay, SWT.CLOSE | SWT.MAX | SWT.MIN | SWT.RESIZE); + + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + shell.setLayout(gridLayout); + HelpBrowser childBrowser = new HelpBrowser(shell, SWT.BORDER, true); + + initializebrowser(currentDisplay, childBrowser.getBrowser()); + event.browser = childBrowser.getBrowser(); + shell.open(); + } + }); + } + + public static void makeGradientTree(final Tree tree) { + /* + * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly. + * Therefore, it is critical for performance that these methods be + * as efficient as possible. + */ + tree.addListener(SWT.EraseItem, new Listener() { + public void handleEvent(Event event) { + event.detail &= ~SWT.HOT; + if ((event.detail & SWT.SELECTED) != 0) { + GC gc = event.gc; + Rectangle area = tree.getClientArea(); + /* + * If you wish to paint the selection beyond the end of + * last column, you must change the clipping region. + */ + int columnCount = tree.getColumnCount(); + if (event.index == columnCount - 1 || columnCount == 0) { + int width = area.x + area.width - event.x; + if (width > 0) { + Region region = new Region(); + gc.getClipping(region); + region.add(event.x, event.y, width, event.height); + gc.setClipping(region); + region.dispose(); + } + } + //gc.setAdvanced(true); + //if (gc.getAdvanced()) gc.setAlpha(127); + Rectangle rect = event.getBounds(); + Color foreground = gc.getForeground(); + Color background = gc.getBackground(); + gc.setForeground(topColor); + gc.setBackground(bottomColor); + gc.fillGradientRectangle(0, rect.y, 200, rect.height, true); + + // restore colors for subsequent drawing + gc.setForeground(foreground); + gc.setBackground(background); + event.detail &= ~SWT.SELECTED; + } + } + }); + } +} diff --git a/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/messages.properties b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/messages.properties new file mode 100644 index 0000000..2071866 --- /dev/null +++ b/org.tizen.nativeplatform/src/org/tizen/nativeplatform/wizards/ui/messages.properties @@ -0,0 +1 @@ +TizenNativePWComposite_WizardToolTipText=Template name: {0}\nSample location: {1} \ No newline at end of file diff --git a/org.tizen.nativeplatform/templates/CustomDebianPackages/EmptyProject/template.properties b/org.tizen.nativeplatform/templates/CustomDebianPackages/EmptyProject/template.properties index 7afbfe8..c96e082 100644 --- a/org.tizen.nativeplatform/templates/CustomDebianPackages/EmptyProject/template.properties +++ b/org.tizen.nativeplatform/templates/CustomDebianPackages/EmptyProject/template.properties @@ -1,5 +1,5 @@ -EmptyProject.Ctemplate.label=Empty Debian Project -EmptyProject.Ctemplate.description=Empty Debian Project +EmptyProject.Ctemplate.label=Empty Platform Project +EmptyProject.Ctemplate.description=Empty Platform Project EmptyProject.basics.label=Advanced Settings EmptyProject.basics.description=Advanced properties of a project EmptyProject.author.label=Author diff --git a/org.tizen.nativeplatform/templates/CustomDebianPackages/HelloWorldProject/template.xml b/org.tizen.nativeplatform/templates/CustomDebianPackages/HelloWorldProject/template.xml index 8e42f4c..1bd95a7 100644 --- a/org.tizen.nativeplatform/templates/CustomDebianPackages/HelloWorldProject/template.xml +++ b/org.tizen.nativeplatform/templates/CustomDebianPackages/HelloWorldProject/template.xml @@ -1,95 +1,99 @@ diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/EmptyProject/template.properties b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/EmptyProject/template.properties index 7afbfe8..c96e082 100644 --- a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/EmptyProject/template.properties +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/EmptyProject/template.properties @@ -1,5 +1,5 @@ -EmptyProject.Ctemplate.label=Empty Debian Project -EmptyProject.Ctemplate.description=Empty Debian Project +EmptyProject.Ctemplate.label=Empty Platform Project +EmptyProject.Ctemplate.description=Empty Platform Project EmptyProject.basics.label=Advanced Settings EmptyProject.basics.description=Advanced properties of a project EmptyProject.author.label=Author diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/changelog b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/changelog index 8db3a56..99516aa 100644 --- a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/changelog +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/changelog @@ -1,5 +1,5 @@ -com.samsung.hello (1.0.0) unstable; urgency=low +$(projectName) (0.0.0-1) unstable; urgency=low - * Initial Release + * initial release - -- Author Fri, 22 Jul 2011 17:32:27 +0900 \ No newline at end of file + -- $(author) <$(e-mail)> Sat, 24 Mar 2012 17:32:27 +0900 \ No newline at end of file diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/control b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/control index 05ebaa0..2a60cb3 100644 --- a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/control +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/control @@ -2,12 +2,10 @@ # THIS FILE IS CREATED AUTOMATICALLY. DO NOT DELETE OR MODIFY THIS FILE. ################################################################################# -Source: com.samsung.hello -Maintainer: Author -Standards-Version: 1.0.0 +Source: com.samsung.$(projectName) +Maintainer: $(author) <$(e-mail)> +Standards-Version: 0.0.1 -Package: com.samsung.hello -description: none -Architecture: any -XB-Permission: -XB-RequiredHardware: +Package: com.samsung.$(projectName) +description: $(description) +Architecture: any \ No newline at end of file diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/rules b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/rules index 88e033a..5590a02 100644 --- a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/rules +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/debian/rules @@ -11,30 +11,30 @@ configure-stamp: dh_testdir # Add here commands to configure the package. touch configure-stamp - + build: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to build the package. mkdir -p bin - $(CC) $(CFLAGS) $(LDFLAGS) src/hello.c -o bin/hello + $(CC) $(CFLAGS) $(LDFLAGS) src/$(projectName).c -o bin/$(projectName) touch build-stamp - -clean: + +clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up before the build process. dh_clean - + install: build dh_testdir dh_testroot - dh_clean -k + dh_clean -k dh_installdirs # Add here commands to install the package. mkdir -p debian/tmp/usr/bin - cp bin/hello debian/tmp/usr/bin/ + cp bin/$(projectName) debian/tmp/usr/bin/ # Build architecture-independent files here. binary-indep: build install @@ -43,12 +43,12 @@ binary-indep: build install binary-arch: build install dh_testdir dh_testroot - dh_installchangelogs + dh_installchangelogs dh_installdocs dh_installexamples dh_install --sourcedir=debian/tmp # dh_installmenu -# dh_installdebconf +# dh_installdebconf # dh_installlogrotate # dh_installemacsen # dh_installpam @@ -59,12 +59,12 @@ binary-arch: build install # dh_installinfo dh_installman dh_link - dh_strip +# dh_strip dh_compress dh_fixperms # dh_perl dh_makeshlibs - dh_installdeb + dh_installdeb # dh_shlibdeps dh_gencontrol dh_md5sums diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/packaging/hello.spec b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/packaging/hello.spec new file mode 100644 index 0000000..95e5905 --- /dev/null +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/packaging/hello.spec @@ -0,0 +1,34 @@ +Name: com.samsung.$(projectName) +Version: 0.0.1 +Release: 1 +License: To be filled +Summary: helloworld application (unstripped) +Packager: $(author) <$(e-mail)> +Group: Application +Source: %{name}-%{version}.tar.gz +%description +$(description) + +%prep +%setup -q + +%build +mkdir -p bin +gcc src/$(projectName).c -o bin/$(projectName) +touch build-stamp + +%install +echo "INSTALL" +mkdir -p $RPM_BUILD_ROOT/usr/bin +cp bin/$(projectName) $RPM_BUILD_ROOT/usr/bin + +%clean +rm -f build-stamp configure-stamp + +%files +%defattr(644, root, root) +%attr(755, root, root) /usr/bin + +%changelog +* Sat Mar 24 2012 Author + - initial release \ No newline at end of file diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/template.xml b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/template.xml index 8e42f4c..0244ab9 100644 --- a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/template.xml +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/HelloWorldProject/template.xml @@ -1,95 +1,104 @@ diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/.buildproperties.xml b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/.buildproperties.xml new file mode 100644 index 0000000..2dc1f3f --- /dev/null +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/.buildproperties.xml @@ -0,0 +1 @@ +${CMAKE_TARGET}capi-application-app_eflcapi-application-app_bundlecapi-base-i18nelementaryecore-xecoreevasedjedlogC-Wall${CMAKE_SOURCE_DIR}/includegO0 \ No newline at end of file diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.properties b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.properties new file mode 100644 index 0000000..260212c --- /dev/null +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.properties @@ -0,0 +1,19 @@ +PlatformProject.Ctemplate.label=Platform Project +PlatformProject.Ctemplate.description=Platform Project +PlatformProject.basics.label=Advanced Settings +PlatformProject.basics.description=Advanced properties of a project +PlatformProject.author.label=Author +PlatformProject.author.description=Name of the author +PlatformProject.author.default=Author +PlatformProject.copyright.label=Copyright +PlatformProject.copyright.description=Your copyright notice +PlatformProject.copyright.default=Your copyright notice +PlatformProject.vendor.label=Vendor +PlatformProject.vendor.default=samsung +PlatformProject.vendor.description=Enter your company or organization. +PlatformProject.description.default=Platform Project +PlatformProject.description.description=Enter a description about your application. +PlatformProject.description.label=Description +PlatformProject.e-mail.default=E-mail +PlatformProject.e-mail.description=Enter your email address +PlatformProject.e-mail.label=E-mail diff --git a/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.xml b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.xml new file mode 100644 index 0000000..1c162f5 --- /dev/null +++ b/org.tizen.nativeplatform/templates/InhouseFrameworkPackages/PlatformProject/template.xml @@ -0,0 +1,74 @@ + + diff --git a/package/build.linux b/package/build.linux index 741790c..7727aac 100755 --- a/package/build.linux +++ b/package/build.linux @@ -1,292 +1,72 @@ -#!/bin/bash -x - -build_path=${SRCDIR}/build_result - -__set_parameter() -{ - build_id=${package_name} - build_type=N - build_result_directory=${build_type}.${build_id} - build_result_path="$build_path/$build_result_directory" - architecture=x86 - ide_root_path_name=IDE - - case ${platform} in - linux) - archive_platform_name=linux - windowing=gtk - ;; - windows) - archive_platform_name=win32 - windowing=win32 - ;; - *) - echo "${platform} is not support yet." - ;; - esac - - result_archive_file=${build_id}-${archive_platform_name}.${windowing}.${architecture}.zip -} - -__set_build_parameter() -{ - case ${platform} in - linux) - reference_ide_path=${ROOTDIR}/indigo-pde/eclipse - ;; - windows) - reference_ide_path=${ROOTDIR}/indigo-winpde/eclipse - ;; - *) - echo "${platform} is not support yet." - ;; - esac -} - -__set_install_parameter() -{ - INSTALL_DIR=${SRCDIR}/package/${package_name}.package.${platform}/data -} - -__clean_build_environment() -{ - if [ -d $build_path ] - then - echo "Build result directory : [$build_path]" - else - echo "Make build result directory [$build_path]" - mkdir -p $build_path - fi - - echo "Remove legacy build files..." - if [ -d ${build_result_path}/${archive_platform_name}.${windowing}.${architecture} ] - then - rm -rf ${build_result_path}/${archive_platform_name}.${windowing}.${architecture} - fi - if [ -e ${build_result_path}/${result_archive_file} ] - then - rm -rf ${build_result_path}/${result_archive_file} - fi - if [ -d ${build_path}/tmp ] - then - rm -rf ${build_path}/tmp - fi - - if [ -d ${build_path}/buildRepo ] - then - rm -rf ${build_path}/buildRepo - fi - - rm -r ${build_path}/*.xml - rm -r ${build_path}/*.properties - rm -r ${build_path}/*.clean - - - if [ -d $build_path/plugins ] - then - echo "plugins directory recreate..." - rm -rf $build_path/plugins - mkdir $build_path/plugins - else - echo "Make plugins directory..." - mkdir $build_path/plugins - fi - if [ -d $build_path/features/ ] - then - echo "features directory recreate..." - rm -rf $build_path/features - mkdir $build_path/features - else - echo "Make features directory..." - mkdir $build_path/features - fi - -} - -__copy_build_sources() -{ - echo "Copy features from $SRCDIR to $build_path/features" - cp -r $SRCDIR/*.feature $build_path/features - - echo "Copy plugins from $SRCDIR to $build_path/plugins" - cp -r $SRCDIR/* $build_path/plugins - rm -rf $build_path/plugins/*.feature -} - -__copy_dependency_plugins() -{ - dependency_plugin_path=${ROOTDIR}/${ide_root_path_name} - if [ -d ${dependency_plugin_path} ] - then - cp -rf ${dependency_plugin_path}/features/* ${build_path}/features/ - cp -rf ${dependency_plugin_path}/plugins/* ${build_path}/plugins/ - fi -} - -__make_ant_build_properties_file() -{ - builder_path="${SRCDIR}/builder" - parent_path_of_based_eclipse=${reference_ide_path}/.. - - echo "Make build.properties file..." - if [ ! -e $builder_path/build.properties.clean ] ; then - echo "ERROR : \"build.properties.clean\" file does not exist..." - exit 1 - fi - cp $builder_path/build.properties.clean $build_path - cp $builder_path/customTargets.xml $build_path - - if [ -d $reference_ide_path ] - then - sed -e "s;\(^buildDirectory=\).*;\1${build_path};g" \ - -e "s;\(^base=\).*;\1${parent_path_of_based_eclipse};g" \ - -e "s;\(^baseLocation=\).*;\1${reference_ide_path};g" \ - -e "s;\(^configs=\).*;\1${archive_platform_name},${windowing},${architecture};g" \ - -e "s;\(^buildType=\).*;\1${build_type};g" \ - -e "s;\(^buildId=\).*;\1${build_id};g" \ - -e "s;\(^archivePrefix=\).*;\1${build_id};g" \ - < $build_path/build.properties.clean > $build_path/build.properties - - else - echo "ERROR : target eclipse is not exist." - exit 1 - fi -} - -__execute_pde_build() -{ - echo "Execute Product Ant Builder..." - equinox_launcher=`echo org.eclipse.equinox.launcher_*.jar` - pde_build=`echo org.eclipse.pde.build_*` - - java -jar ${reference_ide_path}/plugins/$equinox_launcher -application org.eclipse.ant.core.antRunner -buildfile ${reference_ide_path}/plugins/$pde_build/scripts/productBuild/productBuild.xml -Dbuilder=$build_path -Dosgi.locking=none 2>&1 - - if [ $? != 0 ]; - then - echo "Build failed..." - exit 1 - fi -} - -__unzip_plugin_pack() -{ - echo "unzip to $build_result_path" - unzip -a $build_result_path/${result_archive_file} -d $build_result_path/${archive_platform_name}.${windowing}.${architecture} -} - -build_plugins() -{ - case ${platform} in - linux) - echo "build plugin for ${platform}" - ;; - windows) - echo "build plugin for ${platform}" - ;; - *) - echo "${platform} is not support yet." - exit 1 - ;; - esac - - __set_parameter - __set_build_parameter - __clean_build_environment - __copy_build_sources - __copy_dependency_plugins - __make_ant_build_properties_file - __execute_pde_build - __unzip_plugin_pack - - echo "Build SUCCESS. You will find SDK IDE in \"${build_result_path}\"." -} - -__clean_packaging_environment() -{ - - if [ -d ${INSTALL_DIR} ] - then - rm -rf ${INSTALL_DIR} - else - mkdir -p ${INSTALL_DIR} - fi -} +#!/bin/bash -xe __copy_necessary_binaries() { - echo "add necessary files." - ## ex) cp -rf ~~~~/file.file ${INSTALL_DIR}/${ide_root_path_name}/ + echo "add necessary files." + ## ex) + ## ide_root_path_name=IDE + ## cp -rf ~~~~/file.file ${INSTALL_DIR}/${ide_root_path_name}/ } -packaging_plugins() +__set_parameter() { - __set_parameter - __set_install_parameter - - __clean_packaging_environment - __copy_necessary_binaries - - install_ide_path=${INSTALL_DIR}/${ide_root_path_name} - - if [ ! -d ${install_ide_path} ] - then - mkdir -p ${install_ide_path} - fi - - cp -rf ${build_result_path}/${archive_platform_name}.${windowing}.${architecture}/${package_name}/* ${install_ide_path}/ + echo "TARGET_OS : ${TARGET_OS}" + build_script_path=${ROOTDIR}/pde-build } # clean clean() { - echo "=========================================CLEAN============================================" - make clean - rm -rf ${SRCDIR}/*.zip - rm -rf ${SRCDIR}/*.tar.gz - rm -rf ${build_path} + echo "=========================================CLEAN============================================" + __set_parameter + ${build_script_path}/clean.sh ${package_name} } # build build() { - echo "=========================================BUILD============================================" - pkgname_and_platform_list=`awk 'BEGIN{RS="\n\n"; FS="\n"} /Package:/{for(i=1;i 2013-02-14 +* 1.0.45 +- Fixed bug for comparing GBS version +== donghyuk yang 2013-02-08 +* 1.0.44 +- Fixed a bug for cancel action on import dialog +== donghyuk yang 2013-01-21 +* 1.0.43 +- Modified export/import rootstrap process +== donghyuk yang 2013-01-21 +* 1.0.42 +- Set --include-all option to gbs as default +== donghyuk yang 2013-01-18 +* 1.0.41 +- Do not show log on console for unimportant package manager action +== donghyuk yang 2013-01-16 +* 1.0.40 +- Added --nodeps --ignorearch option to rpm when installing local package +== donghyuk yang 2013-01-16 +* 1.0.39 +- Removed AgentProject template +== donghyuk yang 2013-01-14 +* 1.0.38 +- Fixed a bug that modified rootstrap use local path +== donghee yang 2013-01-09 +* 1.0.37 +- Added Boilerplate +- Added --incremental option to GBS tool as default option +== donghyuk.yang 2013-01-04 +* 1.0.36 +- Fixed a bug on gbs version checking +- Fixed bug that sbi plugin-id does not allow dot(.) +- Fixed invalid thread access bug when "Build Project" +- Excluded sources when exporting rootstrap +== donghee yang 2012-12-28 +* 1.0.35 +- Applied New GBS option +== donghee yang 2012-12-27 +* 1.0.34 +- Add wizard preference page +== ho.namkoong 2012-12-21 +* 1.0.33 +- Merge branch "develop" into release +- [develop] Reinitialize SBI after adding and removing rootstrap +- Fix express mode bug in platform wizard +- Reinitialize SBI after adding and removing rootstrap +== donghyuk.yang 2012-12-18 +* 1.0.32 +- Merge branch "develop" into release +- [develop] Added property tab for GBS Options +- [develop] emoved Sample tab from project wizard +- [develop] Added build config action set +- [develop] Check to exist GBS tool +== donghyuk.yang 2012-12-18 +* 1.0.31 +- Removed launch menu of Package Manager +== donghyuk.yang 2012-12-05 +* 1.0.30 +- Removed macos-64 from supported OS +== donghee yang 2012-11-28 +* 1.0.28 +- Merge branch "develop" into release +== donghyuk.yang 2012-11-26 +* 1.0.27 +- Hide preference page for git config and added filter for proxy port +== donghyuk.yang 2012-11-03 +* 1.0.26 +- Rollback status of package manager before latest merging +- Fixed a bug for setting rootstrap path to xml file when modify rootstrap +== donghyuk.yang 2012-11-03 +* 1.0.25 +- Merged latest changes +- [develop] Fixed a bug that project from git is not working when using schema in base uri +- [develop] Check a mismatch architecture between rootstrap and configuration when selecting rootstrap +- [develop] Changed base directory of user rootstraps to "~/tizen-sdk-data" +- [develop] Removed double quotation marks from wizard title and description += donghyuk.yang 2012-11-23 +* 1.0.24 +- Added dis upgrade feature to package manager +- [develop] Modified method for passing environment variables to command launcher +== donghyuk.yang 2012-11-22 +* 1.0.23 +- [develop] Added question dialog if rootstrap is not initialized +- [develop] Do not pass rootstrap name and arch arguments to sbi action script +== donghyuk.yang 2012-11-21 +* 1.0.22 +- [develop] Release for test +== donghee.yang 2012-11-21 +* 1.0.21 +- [develop] Applied new Platfrom SDK concept +== ho.namkoong 2012-11-15 15:39 +* 1.0.20 +- [develop] Create fundamental folder when creating native project +== ho.namkoong 2012-11-15 15:39 diff --git a/package/pkginfo.manifest b/package/pkginfo.manifest index 827d43c..f2a671e 100644 --- a/package/pkginfo.manifest +++ b/package/pkginfo.manifest @@ -1,19 +1,17 @@ -Package:nativeplatform-eplugin -Version:0.20.14 -OS:linux -Build-host-os:linux -Build-dependency:indigo-pde [linux], base-ide-product [linux], common-eplugin [linux], nativecommon-eplugin [linux] -Install-dependency:base-ide-product [linux], common-eplugin [linux], nativecommon-eplugin [linux] +Version:1.0.46 Source:nativeplatform-eplugin -Maintainer:Kangho Kim , Yoonki Park, Taeyoung Son +Maintainer:Kangho Kim , Yoonki Park, Hyunsik Noh, Gun Kim, Ho Namkoong, Taeyoung Son + +Package:nativeplatform-eplugin +OS:ubuntu-32 +Build-host-os:ubuntu-32 +Build-dependency:base-ide-product [ubuntu-32], pde-build [ubuntu-32], common-eplugin [ubuntu-32], nativecommon-eplugin [ubuntu-32], nativeappcommon-eplugin [ubuntu-32] +Install-dependency:base-ide-product [ubuntu-32], common-eplugin [ubuntu-32], nativecommon-eplugin [ubuntu-32] Description:Nativeplatform plugin Package:nativeplatform-eplugin -Version:0.20.14 -OS:windows -Build-host-os:linux -Build-dependency:indigo-winpde [windows], base-ide-product [windows], common-eplugin [windows], nativecommon-eplugin [windows] -Install-dependency:base-ide-product [windows], common-eplugin [windows], nativecommon-eplugin [windows] -Source:nativeplatform-eplugin -Maintainer:Kangho Kim , Yoonki Park, Taeyoung Son +OS:ubuntu-64 +Build-host-os:ubuntu-32 +Build-dependency:base-ide-product [ubuntu-64], pde-build [ubuntu-64], common-eplugin [ubuntu-64], nativecommon-eplugin [ubuntu-64], nativeappcommon-eplugin [ubuntu-64] +Install-dependency:base-ide-product [ubuntu-64], common-eplugin [ubuntu-64], nativecommon-eplugin [ubuntu-64] Description:Nativeplatform plugin -- 2.7.4