MediaTree.cpp
上传用户:boyawuliu
上传日期:2021-10-14
资源大小:8k
文件大小:4k
源码类别:

TreeView控件

开发平台:

Visual C++

  1. // MediaTree.cpp : Defines the entry point for the console application.
  2. //
  3. #include "MediaTree.h"
  4. #include "MediaBase.h"
  5. #include "MediaDevice.h"
  6. #include "Song.h"
  7. #include "Video.h"
  8. #include "Picture.h"
  9. #include "File.h"
  10. #include <iostream>
  11. #include <ios>
  12. #include <string>
  13. #include <limits>
  14. // The one and only application object
  15. std::list<MediaBase*>* MediaDeviceList;
  16. using namespace std;
  17. #undef max
  18. template<typename T>
  19. bool simple_input(T& x)
  20. {
  21. if (std::cin >> std::noskipws >> x >> std::skipws && std::cin.get() == 'n')
  22. return true;
  23.     x = T();
  24.     std::cin.clear();
  25. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
  26.     return false;
  27. }
  28. bool simple_input(char* &x)
  29. {
  30. string s;
  31.     if (std::getline(std::cin, s))
  32. {
  33. const char* all = s.c_str();
  34. int len = 1 + strlen(all);
  35. char* t = new char[len]; 
  36. strcpy(t, all);
  37. x = t;
  38.         return true;
  39. }
  40.     s.clear();
  41.     std::cin.clear();
  42.     return false;
  43. }
  44. int printMainCommand()
  45. {
  46. cout << "Please select command number:" << endl;
  47. cout << "1: Insert media" << endl;
  48. cout << "2: Print media tree" << endl;
  49. cout << "3: Quit" << endl;
  50. int command = 0;
  51. simple_input(command);
  52. return command;
  53. }
  54. MediaBase* InsertMedia()
  55. {
  56. cout << "Please type the media type:" << endl;
  57. cout << "0: Media device" << endl;
  58. cout << "1: Song" << endl;
  59. cout << "2: Video" << endl;
  60. cout << "3: Picture" << endl;
  61. cout << "4: File" << endl;
  62. int command = 0;
  63. simple_input(command);
  64. if (command >= 0 && command < 5)
  65. {
  66. MediaBase* result = NULL;
  67. if (command >= 1 && command < 5)
  68. {
  69. cout << "Please type the media device name of new media need to insert:" << endl;
  70. char* name = NULL;
  71. simple_input(name);
  72. for(list<MediaBase*>::iterator i = MediaDeviceList->begin(); i != MediaDeviceList->end(); i++)
  73. {
  74. MediaBase* child = *i;
  75. result = child->GetMediaByName(name);
  76. if (result != NULL)
  77. break;
  78. }
  79. if (result == NULL)
  80. {
  81. cout << "Cannot found media device name " << name << endl;
  82. return NULL;
  83. }
  84. }
  85. cout << "Please type new media name:" << endl;
  86. char* name = NULL;
  87. simple_input(name);
  88. char* keywords = NULL;
  89. if (command >= 1 && command < 5)
  90. {
  91. cout << "Please type key words for new media (seperate by comma):" << endl;
  92. simple_input(keywords);
  93. }
  94. MediaBase* newMedia;
  95. int mediaTypeIndex = command;
  96. switch (mediaTypeIndex)
  97. {
  98. case 0:
  99. newMedia = new MediaDevice();
  100. break;
  101. case 1:
  102. newMedia = new Song();
  103. break;
  104. case 2:
  105. newMedia = new Video();
  106. break;
  107. case 3:
  108. newMedia = new Picture();
  109. break;
  110. case 4:
  111. newMedia = new File();
  112. break;
  113. }
  114. newMedia->SetMediaName(name);
  115. if (command > 0)
  116. {
  117. char* keyword = strtok(keywords, ",");
  118. while (keyword != NULL)
  119. {
  120. newMedia->AddKeyword(keyword);
  121. keyword = strtok(NULL, ",");
  122. }
  123. result->GetChildList()->push_back(newMedia);
  124. }
  125. else
  126. {
  127. MediaDeviceList->push_back(newMedia);
  128. }
  129. return newMedia;
  130. }
  131. else
  132. {
  133. cout << "You choose the wrong media type." << endl;
  134. return NULL;
  135. }
  136. }
  137. void PrintMediaTree()
  138. {
  139. for(list<MediaBase*>::iterator i = MediaDeviceList->begin(); i != MediaDeviceList->end(); i++)
  140. {
  141. MediaBase* child = *i;
  142. child->PrintMedia();
  143. }
  144. }
  145. int main(int argc, char* argv[], char* envp[])
  146. {
  147. int nRetCode = 0;
  148. bool quit = 0;
  149. MediaDeviceList = new std::list<MediaBase*>();
  150. while (!quit)
  151. {
  152. int command = printMainCommand();
  153. switch (command)
  154. {
  155. case 1:
  156. if (InsertMedia() == NULL)
  157. {
  158. cout << "Cannot insert new media!" << endl;
  159. }
  160. break;
  161. case 2:
  162. PrintMediaTree();
  163. break;
  164. case 3:
  165. return 0;
  166. }
  167. }
  168. return nRetCode;
  169. }