ProjectBrowser.st
changeset 1037 3a75844e668a
parent 1026 ee8a738cd35d
child 1038 41da0e38af84
equal deleted inserted replaced
1036:26ebad245428 1037:3a75844e668a
     1 ApplicationModel subclass:#ProjectBrowser
     1 ToolApplicationModel subclass:#ProjectBrowser
     2 	instanceVariableNames:'projectTree'
     2 	instanceVariableNames:'projectTree'
     3 	classVariableNames:''
     3 	classVariableNames:''
     4 	poolDictionaries:''
     4 	poolDictionaries:''
     5 	category:'Interface-Smalltalk'
     5 	category:'Interface-Smalltalk'
     6 !
     6 !
    65               )
    65               )
    66           )
    66           )
    67       )
    67       )
    68 !
    68 !
    69 
    69 
       
    70 rightCanvasSpecForClassList
       
    71     "This resource specification was automatically generated
       
    72      by the UIPainter of ST/X."
       
    73 
       
    74     "Do not manually edit this!! If it is corrupted,
       
    75      the UIPainter may not be able to read the specification."
       
    76 
       
    77     "
       
    78      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForClassList
       
    79      ProjectBrowser new openInterface:#rightCanvasSpecForClassList
       
    80     "
       
    81 
       
    82     <resource: #canvas>
       
    83 
       
    84     ^
       
    85      
       
    86        #(#FullSpec
       
    87           #window: 
       
    88            #(#WindowSpec
       
    89               #name: 'NewApplication'
       
    90               #layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
       
    91               #level: 0
       
    92               #label: 'NewApplication'
       
    93               #min: #(#Point 10 10)
       
    94               #max: #(#Point 1280 1024)
       
    95               #bounds: #(#Rectangle 216 173 516 473)
       
    96               #usePreferredExtent: false
       
    97           )
       
    98           #component: 
       
    99            #(#SpecCollection
       
   100               #collection: 
       
   101                #(
       
   102                  #(#DataSetSpec
       
   103                     #name: 'classTable'
       
   104                     #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
       
   105                     #hasHorizontalScrollBar: true
       
   106                     #hasVerticalScrollBar: true
       
   107                     #dataList: #classList
       
   108                     #has3Dsepartors: false
       
   109                     #columnHolder: #classTableColumns
       
   110                     #columnAdaptor: #classTableAdaptor
       
   111                 )
       
   112               )
       
   113           )
       
   114       )
       
   115 !
       
   116 
    70 rightCanvasSpecForEditableText
   117 rightCanvasSpecForEditableText
    71     "This resource specification was automatically generated
   118     "This resource specification was automatically generated
    72      by the UIPainter of ST/X."
   119      by the UIPainter of ST/X."
    73 
   120 
    74     "Do not manually edit this!! If it is corrupted,
   121     "Do not manually edit this!! If it is corrupted,
   110               )
   157               )
   111           )
   158           )
   112       )
   159       )
   113 !
   160 !
   114 
   161 
       
   162 rightCanvasSpecForHTMLText
       
   163     "This resource specification was automatically generated
       
   164      by the UIPainter of ST/X."
       
   165 
       
   166     "Do not manually edit this!! If it is corrupted,
       
   167      the UIPainter may not be able to read the specification."
       
   168 
       
   169     "
       
   170      UIPainter new openOnClass:ProjectBrowser andSelector:#rightCanvasSpecForHTMLText
       
   171      ProjectBrowser new openInterface:#rightCanvasSpecForHTMLText
       
   172     "
       
   173 
       
   174     <resource: #canvas>
       
   175 
       
   176     ^
       
   177      
       
   178        #(#FullSpec
       
   179           #window: 
       
   180            #(#WindowSpec
       
   181               #name: 'NewApplication'
       
   182               #layout: #(#LayoutFrame 216 0 173 0 515 0 472 0)
       
   183               #level: 0
       
   184               #label: 'NewApplication'
       
   185               #min: #(#Point 10 10)
       
   186               #max: #(#Point 1280 1024)
       
   187               #bounds: #(#Rectangle 216 173 516 473)
       
   188               #usePreferredExtent: false
       
   189           )
       
   190           #component: 
       
   191            #(#SpecCollection
       
   192               #collection: 
       
   193                #(
       
   194                  #(#HTMLViewSpec
       
   195                     #name: 'HTMLBrowser1'
       
   196                     #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
       
   197                     #model: #htmlDocumentURLHolder
       
   198                     #hasHorizontalScrollBar: true
       
   199                     #hasVerticalScrollBar: true
       
   200                 )
       
   201               )
       
   202           )
       
   203       )
       
   204 !
       
   205 
   115 rightCanvasSpecForReadOnlyText
   206 rightCanvasSpecForReadOnlyText
   116     "This resource specification was automatically generated
   207     "This resource specification was automatically generated
   117      by the UIPainter of ST/X."
   208      by the UIPainter of ST/X."
   118 
   209 
   119     "Do not manually edit this!! If it is corrupted,
   210     "Do not manually edit this!! If it is corrupted,
   177        #(#FullSpec
   268        #(#FullSpec
   178           #window: 
   269           #window: 
   179            #(#WindowSpec
   270            #(#WindowSpec
   180               #name: 'ProjectBrowser'
   271               #name: 'ProjectBrowser'
   181               #layout: #(#LayoutFrame 216 0 173 0 779 0 495 0)
   272               #layout: #(#LayoutFrame 216 0 173 0 779 0 495 0)
       
   273               #level: 0
   182               #label: 'ProjectBrowser'
   274               #label: 'ProjectBrowser'
   183               #min: #(#Point 10 10)
   275               #min: #(#Point 10 10)
   184               #max: #(#Point 1024 768)
   276               #max: #(#Point 1024 768)
   185               #bounds: #(#Rectangle 216 173 780 496)
   277               #bounds: #(#Rectangle 216 173 780 496)
   186               #menu: #mainMenu
   278               #menu: #mainMenu
   196                     #menu: #menu
   288                     #menu: #menu
   197                     #textDefault: true
   289                     #textDefault: true
   198                 )
   290                 )
   199                  #(#VariableHorizontalPanelSpec
   291                  #(#VariableHorizontalPanelSpec
   200                     #name: 'VariableHorizontalPanel1'
   292                     #name: 'VariableHorizontalPanel1'
   201                     #layout: #(#LayoutFrame 0 0.0 40 0.0 0 1.0 0 1.0)
   293                     #layout: #(#LayoutFrame 0 0.0 40 0.0 0 1.0 -24 1.0)
   202                     #component: 
   294                     #component: 
   203                      #(#SpecCollection
   295                      #(#SpecCollection
   204                         #collection: 
   296                         #collection: 
   205                          #(
   297                          #(
   206                            #(#SelectionInTreeViewSpec
   298                            #(#SelectionInTreeViewSpec
   207                               #name: 'TreeList1'
   299                               #name: 'TreeList1'
   208                               #model: #selectedTreeNode
   300                               #model: #selectedTreeNode
   209                               #menu: #itemMenuHolder
   301                               #menu: #itemMenuHolder
       
   302                               #performer: #itemMenuPerformer
   210                               #hasHorizontalScrollBar: true
   303                               #hasHorizontalScrollBar: true
   211                               #hasVerticalScrollBar: true
   304                               #hasVerticalScrollBar: true
   212                               #miniScrollerHorizontal: true
   305                               #miniScrollerHorizontal: true
   213                               #showRoot: false
   306                               #showRoot: false
   214                               #showDirectoryIndicatorForRoot: false
   307                               #showDirectoryIndicatorForRoot: false
   224                               #specHolder: #currentCanvasHolder
   317                               #specHolder: #currentCanvasHolder
   225                           )
   318                           )
   226                         )
   319                         )
   227                     )
   320                     )
   228                     #handles: #(#Any 0.379433 1.0)
   321                     #handles: #(#Any 0.379433 1.0)
       
   322                 )
       
   323                  #(#UISubSpecification
       
   324                     #name: 'infoBarSubSpec'
       
   325                     #layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0)
       
   326                     #majorKey: #ToolApplicationModel
       
   327                     #minorKey: #windowSpecForInfoBar
   229                 )
   328                 )
   230               )
   329               )
   231           )
   330           )
   232       )
   331       )
   233 ! !
   332 ! !
   424                 #enabled: #hasProjectSelectedHolder
   523                 #enabled: #hasProjectSelectedHolder
   425             )
   524             )
   426           ) nil
   525           ) nil
   427           nil
   526           nil
   428       )
   527       )
       
   528 !
       
   529 
       
   530 subProjectsItemMenu
       
   531     "This resource specification was automatically generated
       
   532      by the MenuEditor of ST/X."
       
   533 
       
   534     "Do not manually edit this!! If it is corrupted,
       
   535      the MenuEditor may not be able to read the specification."
       
   536 
       
   537     "
       
   538      MenuEditor new openOnClass:ProjectBrowser andSelector:#subProjectsItemMenu
       
   539      (Menu new fromLiteralArrayEncoding:(ProjectBrowser subProjectsItemMenu)) startUp
       
   540     "
       
   541 
       
   542     <resource: #menu>
       
   543 
       
   544     ^
       
   545      
       
   546        #(#Menu
       
   547           
       
   548            #(
       
   549              #(#MenuItem
       
   550                 #label: 'New SubProject'
       
   551                 #translateLabel: true
       
   552                 #value: #newSubProject
       
   553                 #enabled: #hasSubProjectsSelectedHolder
       
   554             )
       
   555           ) nil
       
   556           nil
       
   557       )
       
   558 ! !
       
   559 
       
   560 !ProjectBrowser class methodsFor:'tableColumns specs'!
       
   561 
       
   562 classTableColumns
       
   563     "This resource specification was automatically generated
       
   564      by the DataSetBuilder of ST/X."
       
   565 
       
   566     "Do not manually edit this!! If it is corrupted,
       
   567      the DataSetBuilder may not be able to read the specification."
       
   568 
       
   569     "
       
   570      DataSetBuilder new openOnClass:ProjectBrowser andSelector:#classTableColumns
       
   571     "
       
   572 
       
   573     <resource: #tableColumns>
       
   574 
       
   575 
       
   576     ^ #(
       
   577         #(#DataSetColumnSpec
       
   578            #label: 'Class'
       
   579            #id: 'classColumn'
       
   580            #labelAlignment: #left
       
   581            #model: #classNameFromClassInfo:
       
   582        )
       
   583         #(#DataSetColumnSpec
       
   584            #label: 'Included'
       
   585            #id: 'inclusion'
       
   586            #columnAlignment: #center
       
   587            #width: 100
       
   588            #editorType: #ComboList
       
   589            #model: #classIncludeConditionFromClassInfo:
       
   590        )
       
   591         #(#DataSetColumnSpec
       
   592            #label: 'Filename'
       
   593            #labelAlignment: #left
       
   594            #minWidth: 200
       
   595            #model: #classFilenameFromClassInfo:
       
   596        )
       
   597      )
   429 ! !
   598 ! !
   430 
   599 
   431 !ProjectBrowser methodsFor:'aspects'!
   600 !ProjectBrowser methodsFor:'aspects'!
       
   601 
       
   602 classList
       
   603     "automatically generated by UIPainter ..."
       
   604 
       
   605     "*** the code below creates a default model when invoked."
       
   606     "*** (which may not be the one you wanted)"
       
   607     "*** Please change as required and accept in the browser."
       
   608 
       
   609     |holder|
       
   610 
       
   611     (holder := builder bindingAt:#classList) isNil ifTrue:[
       
   612         builder aspectAt:#classList put:(holder :=  List new).
       
   613     ].
       
   614     ^ holder.
       
   615 !
       
   616 
       
   617 classTableAdaptor
       
   618     ^ self
       
   619 !
       
   620 
       
   621 classTableColumns
       
   622     "automatically generated by UIPainter ..."
       
   623 
       
   624     "*** the code below creates a default model when invoked."
       
   625     "*** (which may not be the one you wanted)"
       
   626     "*** Please change as required and accept in the browser."
       
   627 
       
   628     |holder|
       
   629 
       
   630     (holder := builder bindingAt:#classTableColumns) isNil ifTrue:[
       
   631         builder aspectAt:#classTableColumns put:(holder :=  ValueHolder new).
       
   632     ].
       
   633     ^ holder.
       
   634 !
   432 
   635 
   433 currentCanvasHolder
   636 currentCanvasHolder
   434     "automatically generated by UIPainter ..."
   637     "automatically generated by UIPainter ..."
   435 
   638 
   436     "*** the code below creates a default model when invoked."
   639     "*** the code below creates a default model when invoked."
   449     ^ [
   652     ^ [
   450         self hasProjectNodeSelected
   653         self hasProjectNodeSelected
   451       ]
   654       ]
   452 !
   655 !
   453 
   656 
       
   657 hasSubProjectsSelectedHolder
       
   658     ^ [
       
   659         self hasSubProjectsNodeSelected
       
   660       ]
       
   661 !
       
   662 
       
   663 htmlDocumentURLHolder
       
   664     "automatically generated by UIPainter ..."
       
   665 
       
   666     "*** the code below creates a default model when invoked."
       
   667     "*** (which may not be the one you wanted)"
       
   668     "*** Please change as required and accept in the browser."
       
   669 
       
   670     |holder|
       
   671 
       
   672     (holder := builder bindingAt:#htmlDocumentURLHolder) isNil ifTrue:[
       
   673         builder aspectAt:#htmlDocumentURLHolder put:(holder :=  ValueHolder new).
       
   674     ].
       
   675     ^ holder.
       
   676 !
       
   677 
   454 projectTreeHolder
   678 projectTreeHolder
   455     "automatically generated by UIPainter ..."
   679     "automatically generated by UIPainter ..."
   456 
   680 
   457     "*** the code below creates a default model when invoked."
   681     "*** the code below creates a default model when invoked."
   458     "*** (which may not be the one you wanted)"
   682     "*** (which may not be the one you wanted)"
   513 
   737 
   514 itemMenu
   738 itemMenu
   515     self hasProjectNodeSelected ifTrue:[
   739     self hasProjectNodeSelected ifTrue:[
   516         ^ self class projectItemMenu
   740         ^ self class projectItemMenu
   517     ].      
   741     ].      
       
   742     self hasSubProjectsNodeSelected ifTrue:[
       
   743         ^ self class subProjectsItemMenu
       
   744     ].      
   518 
   745 
   519     ^ nil
   746     ^ nil
   520 !
   747 !
   521 
   748 
   522 itemMenuHolder
   749 itemMenuHolder
   523     ^ [ self itemMenu]
   750     ^ [ self itemMenu]
       
   751 !
       
   752 
       
   753 itemMenuPerformer
       
   754     ^ self
   524 ! !
   755 ! !
   525 
   756 
   526 !ProjectBrowser methodsFor:'private'!
   757 !ProjectBrowser methodsFor:'private'!
   527 
   758 
   528 hasProjectNodeSelected
   759 hasProjectNodeSelected
   530 
   761 
   531     selectedNode := self selectedTreeNode value.
   762     selectedNode := self selectedTreeNode value.
   532     selectedNode isNil ifTrue:[^ false].
   763     selectedNode isNil ifTrue:[^ false].
   533 
   764 
   534     ^ selectedNode isProjectNode
   765     ^ selectedNode isProjectNode
       
   766 
       
   767 !
       
   768 
       
   769 hasSubProjectsNodeSelected
       
   770     |selectedNode|
       
   771 
       
   772     selectedNode := self selectedTreeNode value.
       
   773     selectedNode isNil ifTrue:[^ false].
       
   774 
       
   775     ^ selectedNode contents == #subprojects
   535 
   776 
   536 !
   777 !
   537 
   778 
   538 nodeFor:aProject
   779 nodeFor:aProject
   539     "generate and return a treeNode for some project"
   780     "generate and return a treeNode for some project"
   560 
   801 
   561     commentNode action:[:item | self showCommentOf:item].
   802     commentNode action:[:item | self showCommentOf:item].
   562     commentNode contents:#comment.
   803     commentNode contents:#comment.
   563 
   804 
   564     docNode contents:#documentation.
   805     docNode contents:#documentation.
       
   806     docNode action:[:item | self showDocumentationFor:item].
       
   807 
       
   808     classesNode contents:#classes.
   565 
   809 
   566     propertiesNode contents:#properties.
   810     propertiesNode contents:#properties.
   567 
   811 
   568     prerequisitesNode contents:#prerequisites.
   812     prerequisitesNode contents:#prerequisites.
   569 
   813 
   603     selectedNode isProjectNode ifTrue:[
   847     selectedNode isProjectNode ifTrue:[
   604         self showCommentOf:selectedNode.
   848         self showCommentOf:selectedNode.
   605         ^ self.
   849         ^ self.
   606     ].
   850     ].
   607 
   851 
       
   852     selectedNode contents == #classes ifTrue:[
       
   853         self showClassListOf:selectedNode.
       
   854         ^ self.
       
   855     ].
       
   856 
   608     self currentCanvasHolder value:(self class emptyRightCanvasSpec).
   857     self currentCanvasHolder value:(self class emptyRightCanvasSpec).
   609     self rightCanvasTextHolder value:''.
   858     self rightCanvasTextHolder value:''.
   610 
   859 
       
   860 ! !
       
   861 
       
   862 !ProjectBrowser methodsFor:'private - table col access'!
       
   863 
       
   864 classNameFromClassInfo:cInfo
       
   865 Transcript showCR:'xxx'.
       
   866     self halt.
   611 ! !
   867 ! !
   612 
   868 
   613 !ProjectBrowser methodsFor:'user actions'!
   869 !ProjectBrowser methodsFor:'user actions'!
   614 
   870 
   615 itemSelected:index
   871 itemSelected:index
   623         action value:item.
   879         action value:item.
   624     ].
   880     ].
   625 !
   881 !
   626 
   882 
   627 newProject
   883 newProject
   628     |newNode newProject|
   884     self newProject:Project new.
   629 
   885 
   630     newProject := Project new.
   886 !
       
   887 
       
   888 newProject:newProject
       
   889     |newNode|
       
   890 
   631     newNode := self nodeFor:newProject.
   891     newNode := self nodeFor:newProject.
   632     projectTree add:newNode.
   892     projectTree add:newNode.
   633     self projectTreeHolder root:projectTree.
   893     self projectTreeHolder root:projectTree.
   634 
   894 
   635 !
   895 !
   636 
   896 
   637 newSubProject
   897 newSubProject
   638     |selectedNode subNode newNode parentProject newProject|
   898     |selectedNode subProjectsNode newNode parentProject newProject|
       
   899 
       
   900     selectedNode := self selectedTreeNode value.
   639 
   901 
   640     self hasProjectNodeSelected ifTrue:[
   902     self hasProjectNodeSelected ifTrue:[
   641         selectedNode := self selectedTreeNode value.
       
   642         parentProject := selectedNode contents.
   903         parentProject := selectedNode contents.
   643 
   904         subProjectsNode := selectedNode children detect:[:child | child contents == #subprojects].
       
   905     ] ifFalse:[
       
   906         self hasSubProjectsNodeSelected ifTrue:[
       
   907             subProjectsNode := selectedNode.
       
   908             parentProject := selectedNode parent contents.
       
   909         ].
       
   910     ].
       
   911 self halt.
       
   912     parentProject notNil ifTrue:[
   644         newProject := Project new.
   913         newProject := Project new.
   645         newNode := self nodeFor:newProject.
   914         newNode := self nodeFor:newProject.
   646 
   915 
   647         parentProject addSubProject:newProject.
   916         parentProject addSubProject:newProject.
   648         subNode := selectedNode children detect:[:child | child contents == #subprojects].
   917         subProjectsNode add:newNode.
   649         subNode add:newNode.
       
   650         self projectTreeHolder root:projectTree.
   918         self projectTreeHolder root:projectTree.
       
   919         self projectTreeHolder selectNode:newNode.
       
   920     ]    
       
   921 !
       
   922 
       
   923 openProject
       
   924     |fn newProject|
       
   925 
       
   926     fn := Dialog 
       
   927         requestFileName:'filename:' 
       
   928         default:nil
       
   929         ifFail:nil
       
   930         pattern:'*.prj'
       
   931         fromDirectory:(FileSelectionBox lastFileSelectionDirectory).
       
   932 
       
   933     fn notNil ifTrue:[
       
   934         newProject := Project new loadFromProjectFile:fn.
       
   935         newProject notNil ifTrue:[
       
   936             self newProject:newProject
       
   937         ]
   651     ]
   938     ]
   652 !
   939 !
   653 
   940 
   654 removeSubProject
   941 removeProject
   655     |projectToRemove selectedNode subNode newNode parentProject newProject|
   942     |projectToRemove selectedNode subNode newNode parentNode parentProject newProject|
   656 
   943 
   657     self hasProjectNodeSelected ifTrue:[
   944     self hasProjectNodeSelected ifTrue:[
   658         selectedNode := self selectedTreeNode value.
   945         selectedNode := self selectedTreeNode value.
   659         projectToRemove := selectedNode contents.
   946         projectToRemove := selectedNode contents.
   660 
   947 
   661         selectedNode parentNode isProjectNode.
   948 "/        parentNode := selectedNode parent.
   662 
   949 "/        parentNode contents == #subprojects ifTrue:[
   663         parentProject addSubProject:newProject.
   950 "/            parentNode removeChild:selectedNode.
   664         subNode := selectedNode children detect:[:child | child contents == #subprojects].
   951 "/        ] ifFalse:[
   665         subNode add:newNode.
   952 "/            parentNode removeChild:selectedNode.
   666         self projectTreeHolder root:projectTree.
   953 "/        ].
       
   954         self projectTreeHolder removeSelection
       
   955 
       
   956 "/        self projectTreeHolder root:projectTree.
       
   957 
       
   958 "/        parentProject addSubProject:newProject.
       
   959 "/        subNode := selectedNode children detect:[:child | child contents == #subprojects].
       
   960 "/        subNode add:newNode.
       
   961 "/        self projectTreeHolder root:projectTree.
   667     ]
   962     ]
       
   963 !
       
   964 
       
   965 renameProject
       
   966     |nm selectedNode selectedProject|
       
   967 
       
   968     self hasProjectNodeSelected ifTrue:[
       
   969         selectedNode := self selectedTreeNode value.
       
   970         selectedProject := selectedNode contents.
       
   971 
       
   972         nm := Dialog 
       
   973                 request:'Rename to:'
       
   974                 initialAnswer:selectedProject name.
       
   975 
       
   976         nm size > 0 ifTrue:[
       
   977             selectedProject name:nm.
       
   978             selectedNode name:nm.
       
   979             selectedNode changed.
       
   980         ]
       
   981     ]
       
   982 !
       
   983 
       
   984 showClassListOf:anItem
       
   985     |projectItem project classInfo l|
       
   986 
       
   987     projectItem := anItem parent.
       
   988     project := projectItem contents.
       
   989 
       
   990     classInfo := project classInfo.
       
   991     l := self classList.
       
   992     l removeAll.
       
   993     l addAll:classInfo.
       
   994 self halt.
       
   995 
       
   996     self currentCanvasHolder value:(self class rightCanvasSpecForClassList).
   668 !
   997 !
   669 
   998 
   670 showCommentOf:anItem
   999 showCommentOf:anItem
   671     |projectItem project|
  1000     |projectItem project|
   672 
  1001 
   680     self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
  1009     self currentCanvasHolder value:(self class rightCanvasSpecForEditableText).
   681     self rightCanvasTextHolder value:project comment.
  1010     self rightCanvasTextHolder value:project comment.
   682 
  1011 
   683 !
  1012 !
   684 
  1013 
       
  1014 showDocumentationFor:anItem
       
  1015     |projectItem project|
       
  1016 
       
  1017     anItem contents == #documentation ifTrue:[
       
  1018         projectItem := anItem parent
       
  1019     ] ifFalse:[
       
  1020         projectItem := anItem
       
  1021     ].
       
  1022     project := projectItem contents.
       
  1023 
       
  1024     self currentCanvasHolder value:(self class rightCanvasSpecForHTMLText).
       
  1025     self htmlDocumentURLHolder value:project documentationURL.
       
  1026 !
       
  1027 
   685 showReadOnlyText:someText
  1028 showReadOnlyText:someText
   686     self currentCanvasHolder value:(self class rightCanvasSpecForReadOnlyText).
  1029     self currentCanvasHolder value:(self class rightCanvasSpecForReadOnlyText).
   687     self rightCanvasTextHolder value:someText.
  1030     self rightCanvasTextHolder value:someText.
   688 
  1031 
   689 !
  1032 !